2010-09-04 13 views
5

Bu sorguyu yazarsam,MySQL dizini IN’de yardımcı değil

EXPLAIN SELECT * FROM `smth` WHERE d_id = 9 

bir satırı anında kontrol eder. Ama IN kullandığımda, örneğin

EXPLAIN SELECT * FROM `smth` WHERE d_id IN (9, 3) 

tüm satırları kontrol eder. İndeks oraya yardımcı olmazsa IN yerine ne yapmalıyım?

+0

evet cevabı bilmiyorum çok merak ediyorum –

+0

Neden tüm satırları kontrol ettiğini düşünüyorsunuz? EXPLAIN SELECTs'in çıktısını yayınlayabilir misiniz? –

+0

İlgi çekici olabilir: http://stackoverflow.com/questions/586381/mysql-not-using-indexes-with-where-in-clause – Fionnuala

cevap

7

MySQL 5.1, IN yüklemlerini optimize eden range birleştirme türüne sahiptir. Ancak http://dev.mysql.com/doc/refman/5.1/en/explain-output.html

Bkz MySQL iyileştirici sizin d_id sütun daha sonra indeksi ve okunması daha bütün tablo okumak için ucuz olacağını karar satır kadar büyük bir çoğunluğunda değerlerini 9 ve 3 içerdiğini belirledik olabilir tablo.

Benzer şekilde, bir kitap okuyorsanız ve kitabın arkasındaki dizine "the" kelimesini içeren her sayfayı bulmak istiyorsanız, "," konusuna bakın ve her sayfaya çevirin sırayla? Ya da sadece kitap örtüsünü okumak için okuyabiliyorsunuz, çünkü hemen hemen her sayfanın üzerinde bu kelimeyi olduğu garanti ediliyor mu?

+2

Gerçekten mükemmel bir açıklamaydı. Çok fazla satır ekledim ve IN'yi tekrar kullanmaya çalıştım ve şimdi sadece birkaç satır değil hepsini kontrol ettim. Teşekkürler. –

1

Muhtemelen tablonuz pek çok satır içermiyordur. Tablonuzda daha fazla satır varsa, muhtemelen dizini kullanır. İşte bir milyon satırlı bir tablodan bir örnek:

 
EXPLAIN SELECT * FROM table1 WHERE x = 9; 
1, 'SIMPLE', 'table1', 'const', 'PRIMARY', 'PRIMARY', '4', 'const', 1, '' 

EXPLAIN SELECT * FROM table1 WHERE x IN (9, 3); 
1, 'SIMPLE', 'table1', 'range', 'PRIMARY', 'PRIMARY', '4', '', 2, 'Using where' 

Her iki durumda da birincil anahtar dizini kullanılır.