Saya punya beberapa duplikat di database yang ingin saya periksa, jadi apa yang saya lakukan untuk melihat duplikat yang mana, saya lakukan ini:
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
Dengan cara ini, saya akan mendapatkan semua baris dengan relevan_field terjadi lebih dari satu kali. Permintaan ini membutuhkan milidetik untuk dieksekusi.
Sekarang, saya ingin memeriksa setiap duplikat, jadi saya pikir saya bisa PILIH setiap baris di some_table dengan relevan_field dalam permintaan di atas, jadi saya suka ini:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
)
Ini ternyata sangat lambat untuk beberapa alasan (butuh beberapa menit). Apa sebenarnya yang terjadi di sini untuk membuatnya sepelan itu? relevan_field diindeks.
Akhirnya saya mencoba membuat tampilan "temp_view" dari kueri pertama (SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1)
, dan kemudian membuat kueri kedua seperti ini:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM temp_view
)
Dan itu bekerja dengan baik. MySQL melakukan ini dalam beberapa milidetik.
Adakah ahli SQL di sini yang dapat menjelaskan apa yang terjadi?