Menggunakan Indeks, Menggunakan Sementara, Menggunakan Filesort: Adakah Pertanyaan MySQL Anda Memerlukan Pengoptimuman?
Apabila mendapatkan semula data daripada jadual pangkalan data, adalah penting untuk tulis pertanyaan yang cekap yang meminimumkan masa pemprosesan dan penggunaan sumber. MySQL menyediakan pelbagai teknik pengoptimuman untuk memudahkan pelaksanaan pertanyaan yang lebih pantas, tetapi kadangkala, pertanyaan masih boleh mempamerkan tingkah laku suboptimum. Dalam kes ini, kami akan meneroka pertanyaan yang mengembalikan "Menggunakan indeks; Menggunakan sementara; Menggunakan failsort" dalam output EXPLAIN.
Mari kita periksa pertanyaan yang disediakan:
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, leo.object_desc ASC
Memahami "Menggunakan Sementara"
Dokumentasi MySQL menyatakan bahawa jadual sementara boleh dibuat apabila terdapat percanggahan antara klausa ORDER BY dan GROUP BY, atau apabila ORDER BY atau GROUP BY mengandungi lajur daripada jadual selain daripada jadual pertama dalam baris gilir gabungan. Dalam pertanyaan ini, kami telah memenuhi kedua-dua syarat. Klausa ORDER BY mengisih mengikut count_rows, yang merupakan medan pengiraan dan kumpulan klausa GROUP BY oleh el.object_id daripada jadual yang berbeza. Oleh itu, penggunaan jadual sementara untuk memudahkan proses pengisihan dan pengumpulan.
Memahami "Menggunakan Filesort"
Memandangkan pengisihan dilakukan pada kiraan medan yang dikira, indeks tidak boleh digunakan untuk operasi ini. Oleh itu, MySQL menggunakan penyisihan fail, yang melibatkan membaca data daripada cakera dan mengisihnya dalam memori sebelum mengembalikan hasilnya.
Mengoptimumkan Pertanyaan
Untuk meningkatkan prestasi daripada pertanyaan ini dan menghapuskan penggunaan jadual sementara dan penyisihan fail, kami boleh mempertimbangkan untuk mencipta indeks yang sesuai, seperti:
CREATE INDEX idx_event_log_object_count ON event_log(object_id, COUNT(event_id));
Indeks ini akan membolehkan MySQL mendapatkan terus kiraan peristiwa untuk setiap object_id, menghapuskan keperluan untuk jadual sementara dan penyisihan fail.
Atas ialah kandungan terperinci Mengapa Pertanyaan MySQL Saya Menggunakan \'Menggunakan Indeks; Menggunakan Sementara; Menggunakan Filesort\'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!