Rumah >pangkalan data >tutorial mysql >Mengapa Pertanyaan Saya Menggunakan Jadual Sementara dan Isih Fail?
Mengapa MySQL Menggunakan Temporary dan Filesort dalam Pertanyaan Ini
Pertanyaan anda untuk mengekstrak statistik objek daripada jadual event_log dan lookup_event_objects menghadapi kesesakan prestasi, seperti yang ditunjukkan oleh output EXPLAIN "Menggunakan indeks; Menggunakan sementara; Menggunakan failsort." Inilah sebabnya:
Jadual Sementara
MySQL menggunakan jadual sementara apabila terdapat ketidakpadanan antara klausa ORDER BY dan GROUP BY, atau apabila lajur susunan atau pengumpulan tergolong bukan -meja bercantum. Dalam kes ini, pertanyaan anda mengalami keadaan pertama, kerana klausa ORDER BY (count_rows DESC, leo.object_desc ASC) berbeza daripada GROUP BY clause (el.object_id).
Filesort
"Menggunakan filesort" menunjukkan bahawa MySQL tidak dapat melaksanakan pengisihan yang dinyatakan dalam klausa ORDER BY menggunakan indeks. Memandangkan anda membuat pesanan mengikut medan yang dikira (count_rows), pangkalan data perlu melakukan imbasan jadual lengkap dan mengisih keputusan.
Penyelesaian Kemungkinan
Seperti yang dicadangkan dalam jawapan yang diberikan, penyelesaiannya adalah untuk menghapuskan percanggahan antara klausa ORDER BY dan GROUP BY. Anda boleh menggantikan alias count_rows dengan operasi kiraan sebenar dalam klausa GROUP BY:
SELECT el.object_id, leo.object_desc, COUNT(el.object_id) AS count FROM event_log el LEFT JOIN lookup_event_objects leo ON leo.object_id = el.object_id GROUP BY el.object_id, count ORDER BY count DESC, leo.object_desc ASC;
Ini akan menghapuskan keperluan untuk jadual sementara dan isihan fail, yang berpotensi meningkatkan prestasi pertanyaan.
Atas ialah kandungan terperinci Mengapa Pertanyaan Saya Menggunakan Jadual Sementara dan Isih Fail?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!