Ini adalah kekurangan yang diketahui di MySQL.
Seringkali benar bahwa menggunakan UNION
berkinerja lebih baik daripada kueri rentang seperti yang Anda tampilkan. MySQL tidak menggunakan indeks dengan sangat cerdas untuk ekspresi menggunakan IN (...)
. Lubang serupa ada di pengoptimal untuk ekspresi boolean dengan OR
.
Lihat http ://www.mysqlperformanceblog.com/2006/08/10/using-union-to-implement-loose-index-scan-to-mysql/ untuk beberapa penjelasan dan tolok ukur terperinci.
Pengoptimal sedang ditingkatkan setiap saat. Kekurangan dalam satu versi MySQL dapat diperbaiki di versi berikutnya. Jadi, ada baiknya menguji kueri Anda pada versi yang berbeda.
Juga menguntungkan untuk menggunakan UNION ALL
alih-alih hanya UNION
. Kedua kueri menggunakan tabel sementara untuk menyimpan hasil, tetapi perbedaannya adalah UNION
berlaku DISTINCT
ke set hasil, yang menimbulkan semacam un-indexed tambahan.