yılında endeksi nasıl kullanılacağı:MySQL - NEREDEN x IN (<subquery>) Ben {küçük "a" ile başlayan adıyla müşterilerine} tüm çalışanlara almak için bu sorguyu kullanıyorum
SELECT * FROM employees
WHERE client_id IN (SELECT id FROM clients WHERE name LIKE 'a%')
Sütun employees.client_id
bir olduğunu int, INDEX client_id (index_id)
ile. Alt sorgu, IMHO'nun daha sonra WHERE maddesinde kullanılan bir id-s listesi döndürmesi gerekir.
Sorguyu EXPLAIN
yaptığımda, birincil sorgu hiçbir dizin kullanmaz (type:ALL
). Ancak, alt sorgudan alınan bir liste (ör. SELECT ... WHERE client_id IN (121,184,501)
), EXPLAIN
EXPLAIN
EXPLAIN
, type:range
olarak değişir ve bu sorgu% 50 daha hızlı olur.
Sorguyu, alt sorgu tarafından döndürülen veri için dizini nasıl kullanabilirim - veya bu verileri almanın daha verimli bir yolu var mı? (Kimlik listesini uygulama sunucusuna geri almak, katılmak ve ikinci bir sorgu göndermek burada daha da pahalı).
Şimdiden teşekkürler.
INNER JOIN sözdizimini de kullanabilir. – MarkR
Sorgu en iyi duruma getiricinin gerçekten yanlış anladığı ve kimlikleri döndüren bir alt sorgunun daha hızlı olduğu durumlar gördüm. Ama bu gerçekten özel bir durumdu. Bakınız: http://www.benlumley.co.uk/2008/06/25/mysql-query-optimiser-left-lacking/ Ayrıntılar ile ilgileniyorsanız. – benlumley