Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mengoptimumkan Pertanyaan untuk Mendapatkan Maksimum Mengikut Kumpulan dengan Cekap?

Bagaimanakah Saya Boleh Mengoptimumkan Pertanyaan untuk Mendapatkan Maksimum Mengikut Kumpulan dengan Cekap?

Linda Hamilton
Linda Hamiltonasal
2024-12-26 10:51:10573semak imbas

How Can I Optimize a Query to Efficiently Find the Groupwise Maximum?

Pertanyaan Dioptimumkan untuk Maksimum Mengikut Kumpulan yang Cekap

Masalah Asal:

Pertanyaan

select * 
from records 
where id in ( select max(id) from records group by option_id )

melakukan imbasan berurutan bagi keseluruhan jadual rekod untuk menentukan ID maksimum bagi setiap option_id. Pendekatan ini tidak cekap, terutamanya untuk jadual besar.

Penyelesaian: Sertaan Sisi

Satu penyelesaian ialah memanfaatkan cantuman sisi untuk mengambil ID maksimum bagi setiap option_id dalam subquery:

select r.*
from records r
cross join lateral (
    select max(id) as max_id
    from records
    where option_id = r.option_id
) m
where r.id = m.max_id

Pertanyaan ini menggunakan cantuman sisi untuk mengira ID maksimum dalam subkueri berasingan. Hasilnya digabungkan dengan jadual rekod asal untuk menapis hanya baris dengan ID maksimum.

Mencipta Indeks Khusus

Satu lagi pengoptimuman ialah mencipta indeks khusus pada jadual rekod yang menyimpan ID maksimum untuk setiap option_id:

CREATE INDEX idx_max_id ON records (option_id, max(id))

Indeks ini membolehkan carian terus ID maksimum untuk sesuatu option_id, menghapuskan keperluan untuk subquery asal:

select * 
from records r
where (option_id, id) in (
    select option_id, max(id) from records group by option_id
)

Pendekatan berasaskan indeks dengan ketara mengurangkan bilangan akses jadual, menjadikan pertanyaan lebih cekap untuk jadual besar.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengoptimumkan Pertanyaan untuk Mendapatkan Maksimum Mengikut Kumpulan dengan Cekap?. 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