2012-03-22 27 views
13

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.

+2

"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

+0

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. –

+0

Evet, bu biraz gizemli: "Tablodan GÖSTERİ ENDEKSLERİ" tablosunun çıktısı bunun neden olduğunu görmeye yardımcı olabilir :) – Daan

cevap

6

için faydalı olacaktır.

Bu sorunu bir INDEX kullanarak çözmenin yolunun iki ayrı sorgu yapmak olduğu sonucuna vardım. , INDEX ABC ve daha sonra INDEX ACD kullanacak SELECT A,B,C,D,E FROM table WHERE A=23 AND C=43 kullanacaktır. Bu işlem, (...) UNION (...) ile tek adımda yapılabilir, bu da daha hızlı ortaya çıkar ve sadece INDEX'leri kullanır.

1

Mysql, yalnızca bir bileşik dizinin 'en soldaki' bölümünü kullanabilir.

WHERE A=1 AND B=2 

sonra MySQL A veya AB üzerinde bir dizin kullanabilirsiniz, ancak AB iyi olurdu gibi Yani, senin nerede fıkra görünüyorsa. ACB, dizin başka bir sütun tarafından bölünmüş olarak kullanılamadığından

Verilen WHERE yan tümcesiyle, MySQL sorgu motorunun birden fazla dizin kullanabileceğini düşünmüyorum. Bir AB ve AC yapar ve FORCE INDEX kullanarak hangisinin daha hızlı olduğuna bakın.

Üç sütun bileşik anahtar, A ve diğer bir sütuna karşı ararken bu durumda yardımcı olmaz. Bu tür anahtar, sorgunuz OR yerine AND kullanıyorsa yardımcı olur. SQL deyiminde OR arasında, MySQL sadece ACD olduğunu A içeren ilk indeksi, oluyor çünkü ABC üzerine bir indeks

WHERE A=1 AND B=2 AND C=3 
+2

Evet, "AND" ile ABC sorgusunu beklendiği gibi kullanır. 'A',' AB', 'AC' kullanımı, @Daan’ın daha önce yorumda belirtildiği gibi gereksiz olurdu. MySQL belgelerinden: "Dizinin herhangi bir en soldaki ön eki, satırları bulmak için eniyileyici tarafından kullanılabilir." INDEX "açık (col1, col2, col3), (col1), (col1, col2) üzerinde indekslenmiş arama yetenekleri vardır (col1, col2, col3). " –

+1

Bu VEYA ile ilgili bir soru, VE değil. –