Masalah dengan Temporary dan Filesort dalam MySQL: Skema dan Analisis Pertanyaan
Dalam sistem penjejakan acara dengan jadual carian dan jadual log, isu timbul dengan pertanyaan yang bertujuan untuk memaparkan statistik objek dalam urutan kepentingan menurun. Walaupun pertanyaan berfungsi dengan betul dengan bilangan entri yang kecil, keputusan EXPLAINnya mencadangkan potensi untuk pengoptimuman.
Pertanyaan yang dimaksudkan menggunakan gabungan kiri antara jadual event_log dan lookup_event_objects, mengumpulkan hasil mengikut object_id dan mengisih mengikut count_rows dalam tertib menurun, diikuti dengan object_desc dalam tertib menaik. Walau bagaimanapun, pertanyaan ini menjana amaran tentang menggunakan jadual sementara dan isihan fail.
MySQL menggunakan jadual sementara apabila pertanyaan mengandungi klausa ORDER BY yang berbeza daripada klausa GROUP BY, atau apabila mengisih atau mengumpulkan dirujuk daripada jadual selain daripada yang pertama dalam penyertaan. Dalam kes ini, pengisihan adalah berdasarkan medan yang dikira, menjadikan penggunaan indeks mustahil, oleh itu penggunaan failsort.
Untuk menangani isu tersebut, alih keluar klausa ORDER BY untuk leo.object_desc. Ini akan menghapuskan keperluan untuk jadual sementara dan penyisihan fail, meningkatkan prestasi pertanyaan:
<code class="sql">EXPLAIN SELECT el.object_id, leo.object_desc, COUNT(el.object_id) as count_rows FROM event_log el LEFT JOIN lookup_event_objects leo ON leo.object_id = el.object_id GROUP BY el.object_id ORDER BY count_rows DESC;</code>
Atas ialah kandungan terperinci Mengapa Pertanyaan MySQL Saya Menyebabkan Jadual dan Filesort Sementara?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!