Mengapa Pertanyaan MySQL Saya Menggunakan \'Menggunakan Indeks; Menggunakan Sementara; Menggunakan Filesort\'?

Mary-Kate Olsen
Lepaskan: 2024-11-04 09:42:02
asal
772 orang telah melayarinya

Why is My MySQL Query Using

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
Salin selepas log masuk

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));
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan