INT sütunlarıyla 200k girişli bir tablo var. Sorguları daha hızlı yapmak için bir dizin oluşturmak istiyorum. Bu yürütmek istediğim sorgu: SELECT A,B,C,D,E FROM table WHERE A=23 and (B=45 or C=43)
. Aşağıdaki dizinleri oluşturdum: B
, ACD
, C
, ABC
.MySQL. "OR" sorgusu için bir dizin oluşturma
EXPLAIN
komutuyla MySQL dizininin ACD
dizinini seçtiğini buldum. Bu yüzden masayı daha fazla değerle doldurmaya devam ettim ve MySQL'in yukarıdaki indeksler arasında değiştiğini fark ettim (her zaman aynı değil).
Çok sayıda ek olduğundan, çeşitli dizinlere sahip olmak performans sorunlarına neden olur ve bu tablonun her dizinin anlamlı olduğu farklı sütunlar gerektiren diğer sorgularla erişildiğini varsayabiliriz.
USE INDEX()
'un farkındayım, ancak doğru dizini seçmek için MySQL'e güvenmemiz gerekip gerekmediğini anlamak isterim.
"Bu tablonun, her INDEX'in anlam ifade ettiği farklı sütunlar gerektiren diğer sorgularla erişildiğini varsayabiliriz" diyerek ne demek istiyorsunuz? Bu tür soruların bazı örneklerini verebilir misiniz? Ayrıca bize bir tabloyu sorgudan bir "GÖSTER" DİZİNİ çıktı verebilir misiniz? A, AB ve AC'deki dizinler kesinlikle gereksizdir: bunlar, sırasıyla ACD/ABC, ABC ve ACD'deki dizinlerle kaplıdır. MySQL'in çoklu sütun dizinlerini http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html – Daan
adresinde nasıl işleyeceğini okuyabilirsiniz. Örnek sorgu: 'GET B FROM table WHERE B = 12'. Tamam, A, AB, AC'yi (teşekkürler) kaldırabilirim. Fakat hala ACD'nin kullanılmasının nedenini açıklamıyor. '' '' WHERE' ifadesinde bile değil. –
Evet, bu biraz gizemli: "Tablodan GÖSTERİ ENDEKSLERİ" tablosunun çıktısı bunun neden olduğunu görmeye yardımcı olabilir :) – Daan