Jawaban atas pertanyaan ini bergantung pada apakah Anda menggunakan mysql sebelum 5.7, atau 5.7 dan setelahnya. Saya mungkin sedikit mengubah pertanyaan Anda, tetapi semoga pertanyaan berikut dapat menangkap apa yang Anda cari.
SELECT * FROM Table
melakukan pemindaian tabel melalui indeks berkerumun (pemesanan fisik). Jika tidak ada kunci utama, salah satunya adalah secara implisit
tersedia untuk mesin. Tidak ada klausa di mana seperti yang Anda katakan. Tidak ada penyaringan atau pilihan indeks lain yang dicoba.
Jelaskan
keluaran (lihat juga
) menunjukkan 1 baris dalam ringkasannya. Ini relatif lurus ke depan. Jelaskan output dan kinerja dengan tabel turunan Anda B
akan berbeda tergantung pada apakah Anda menggunakan versi sebelum 5.7, atau 5.7 dan setelahnya.
Dokumen Tabel Turunan di MySQL 5.7 menjelaskannya dengan baik untuk versi 5.6 dan 5.7, di mana yang terakhir tidak akan memberikan penalti karena perubahan dalam output tabel turunan terwujud yang dimasukkan ke dalam kueri luar. Di versi sebelumnya, overhead yang substansial ditanggung dengan tabel sementara dengan turunan.
Cukup mudah untuk menguji penalti kinerja sebelum 5.7. Yang diperlukan hanyalah tabel berukuran sedang untuk melihat dampak nyata yang dimiliki tabel turunan pertanyaan Anda dalam memengaruhi kinerja. Contoh berikut ada di meja kecil di versi 5.6:
explain
select qm1.title
from questions_mysql qm1
join questions_mysql qm2
on qm2.qid<qm1.qid
where qm1.qid>3333 and qm1.status='O';
+----+-------------+-------+-------+-----------------+---------+---------+------+-------+------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+-----------------+---------+---------+------+-------+------------------------------------------------+
| 1 | SIMPLE | qm1 | range | PRIMARY,cactus1 | PRIMARY | 4 | NULL | 5441 | Using where |
| 1 | SIMPLE | qm2 | ALL | PRIMARY,cactus1 | NULL | NULL | NULL | 10882 | Range checked for each record (index map: 0x3) |
+----+-------------+-------+-------+-----------------+---------+---------+------+-------+------------------------------------------------+
explain
select b.title from
( select qid,title from questions_mysql where qid>3333 and status='O'
) b
join questions_mysql qm2
on qm2.qid<b.qid;
+----+-------------+-----------------+-------+-----------------+---------+---------+------+-------+----------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------------+-------+-----------------+---------+---------+------+-------+----------------------------------------------------+
| 1 | PRIMARY | qm2 | index | PRIMARY,cactus1 | cactus1 | 10 | NULL | 10882 | Using index |
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 5441 | Using where; Using join buffer (Block Nested Loop) |
| 2 | DERIVED | questions_mysql | range | PRIMARY,cactus1 | PRIMARY | 4 | NULL | 5441 | Using where |
+----+-------------+-----------------+-------+-----------------+---------+---------+------+-------+----------------------------------------------------+
Catatan, saya memang mengubah pertanyaan, tetapi ini menggambarkan dampak tabel turunan dan kurangnya penggunaan indeks dengan pengoptimal dalam versi sebelum 5.7. Tabel turunan mendapat manfaat dari indeks saat sedang terwujud. Tapi setelah itu bertahan di atas kepala sebagai tabel sementara dan dimasukkan ke dalam kueri luar tanpa menggunakan indeks. Ini tidak terjadi di versi 5.7