Lihat apa yang EXPLAIN EXTENDED katanya.
Jika tertulis DEPENDENT SUBQUERY atau UNCACHEABLE SUBQUERY , maka akan dievaluasi ulang setiap kali digunakan.
Ini terjadi jika subkueri menggunakan variabel sesi atau subkueri yang berkorelasi.
Jika tidak, kemungkinan besar akan di-cache.
Jika kasus Anda, subquery tidak akan di-cache, subquery akan dievaluasi ulang di setiap UNION telah ditetapkan.
Namun, subquery Anda tampaknya terlalu rumit. Mengapa Anda tidak menggunakan saja:
SELECT id
FROM playlist_program_map ppm, programs p
WHERE ppm.playlist_id = 181
AND p.id = ppm.program_id
AND submitter_id = 32
AND feed_id = 2478
Jika Anda memiliki indeks di playlist_program_map (playlist_id) , kueri ini akan berfungsi seperti pesona.
Bisakah Anda memberi tahu saya dua hal lagi:
- Ada berapa baris di
playlist_program_mapdan berapa banyakDISTINCT playlist_idnilai-nilai yang ada?- Berapa banyak baris dalam
programsdan berapa banyakDISTINCT submitter_id, feed_idada pasangan?
- Berapa banyak baris dalam
Dari komentar Anda, saya dapat menyimpulkan bahwa ada 10 programs per playlist rata-rata, dan 200 programs per (submitter, feed) pasangan. Ini berarti indeks Anda di playlist_program_map lebih selektif daripada yang ada di (submitter, feed) , dan playlist_program_map harus memimpin dalam bergabung.
Indeks teks lengkap dalam kasus Anda juga tampaknya tidak terlalu selektif, mengingat Anda harus bergabung dengan 10 program dari 2.000.000 .
Sebaiknya Anda mencoba yang berikut ini:
SELECT object_id, programs.created AS created
FROM playlist_program_map ppm, programs p, comments_programs cp
WHERE ppm.playlist_id = 181
AND p.id = ppm.program_id
AND p.submitter_id = 32
AND p.feed_id = 2478
AND cp.object_id = p.id
AND cp.text REGEXP 'excellent'
, dan ulangi ini untuk ketiga tabel.