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_map
dan berapa banyakDISTINCT playlist_id
nilai-nilai yang ada?- Berapa banyak baris dalam
programs
dan berapa banyakDISTINCT submitter_id, feed_id
ada 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.