Rumah >pangkalan data >tutorial mysql >Mengapa Pertanyaan MySQL Menunjukkan \'Menggunakan Sementara\' dan \'Menggunakan Filesort\' dan Bagaimana Anda Boleh Mengoptimumkannya?

Mengapa Pertanyaan MySQL Menunjukkan \'Menggunakan Sementara\' dan \'Menggunakan Filesort\' dan Bagaimana Anda Boleh Mengoptimumkannya?

DDD
DDDasal
2024-11-04 17:04:02407semak imbas

Why Do MySQL Queries Show

Pengoptimuman MySQL: Memahami "Menggunakan indeks, menggunakan sementara, menggunakan failsort"

Apabila melaksanakan pertanyaan, MySQL mungkin menggunakan jadual sementara dan failsort, seperti yang ditunjukkan oleh mesej "Menggunakan sementara" dan "Menggunakan failsort." Mari kita terokai maksud ini dalam konteks pertanyaan khusus:

EXPLAIN SELECT
    el.object_id,
    leo.object_desc,
    COUNT(el.object_id) AS count_rows
FROM
    event_log AS el
LEFT JOIN
    lookup_event_objects AS leo ON leo.object_id = el.object_id
GROUP BY
    el.object_id
ORDER BY
    count_rows DESC,
    leo.object_desc ASC

"Menggunakan sementara"

Menurut dokumentasi MySQL, jadual sementara dicipta apabila:

  • Terdapat klausa ORDER BY dan klausa GROUP BY berbeza, atau ORDER BY atau GROUP BY mengandungi lajur daripada jadual selain daripada jadual pertama dalam baris gilir gabungan.

Dalam pertanyaan yang diberikan, klausa ORDER BY mengisih mengikut medan pengiraan "count_rows", yang tiada dalam klausa GROUP BY, dan klausa GROUP BY menggunakan lajur daripada jadual bercantum "lookup_event_objects." Oleh itu, MySQL mencipta jadual sementara untuk melaksanakan pengumpulan dan pengisihan.

"Menggunakan filesort"

MySQL menggunakan failsort apabila operasi isihan tidak boleh dilakukan menggunakan indeks. Dalam pertanyaan ini, isihan pada medan pengiraan "count_rows" tidak boleh diindeks, jadi MySQL menggunakan failsort untuk melaksanakan pengisihan.

Pengoptimuman

Untuk mengoptimumkan pertanyaan ini, anda boleh membuat indeks pada "count_rows." Walau bagaimanapun, memandangkan ia adalah medan pengiraan, anda perlu menggunakan helah MySQL:

CREATE TABLE lookup_event_objects_temp AS
SELECT
    object_id,
    object_desc,
    COUNT(DISTINCT event_id) AS count_rows
FROM
    event_log
GROUP BY
    object_id;

CREATE INDEX idx_count_rows ON lookup_event_objects_temp (count_rows);

ALTER TABLE lookup_event_objects_temp RENAME TO lookup_event_objects;

Dengan mencipta jadual sementara ini dengan medan "count_rows" yang diindeks, pertanyaan boleh menggunakan indeks untuk melaksanakan dengan cekap mengisih, menghapuskan keperluan untuk menyusun fail dan mengurangkan penggunaan jadual sementara.

Atas ialah kandungan terperinci Mengapa Pertanyaan MySQL Menunjukkan 'Menggunakan Sementara' dan 'Menggunakan Filesort' dan Bagaimana Anda Boleh Mengoptimumkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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