Pertimbangkan tabel nilai dan hash, seperti:
+------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| val | char(9) | NO | | NULL | |
| val_hashed | char(50) | YES | | NULL | |
+------------+----------+------+-----+---------+----------------+
Permintaan berikut selesai dalam 0,00 detik:
SELECT * FROM hashes ORDER BY 1 DESC LIMIT 1;
Namun, kueri ini membutuhkan 3 menit 17 detik:
SELECT val FROM hashes ORDER BY 1 DESC LIMIT 1;
Saya melihat bahwa ketika kueri sedang menjalankan daftar proses menunjukkannya sebagai status Sorting result
. Situasi ini sepenuhnya dapat direproduksi. Perhatikan bahwa ada proses lain yang melakukan INSERT
operasi di atas meja secara terus menerus.
Mengapa kueri yang lebih spesifik membutuhkan waktu lebih lama untuk dijalankan daripada *
kueri? Saya selalu percaya bahwa *
pertanyaan harus dihindari secara khusus karena alasan kinerja.
ORDER BY NUMBER
sintaks cukup kesalahan rawan.
SELECT *
dikombinasikan dengan indeks kolom dalam ORDER BY
mengaburkan kolom mana yang sedang disortir - alasan lain untuk menghindari *
...
*
tidak eksplisit. Jadi mengatakan "beri saya semua kolom dan urutkan berdasarkan yang ketiga" adalah tentang deterministik seperti mengatakan "pergi ke supermarket dan katakan berapa banyak lampu lalu lintas yang Anda lewati"
id
untuk menemukan baris pertama. Yang kedua perlu mengurutkan hasil lengkap pada kolom (tidak diindeks)val
.