2011-03-31 18 views
8

Birincil sistemde olmayan bir birincil sistemden oluşan bir tablo var. Bir fabrikada materyal vermek için işlem verilerini kaydeder.SELECT ifadesi kullanamaz possible_keys

Basitlik uğruna, her satırın iş_esi, parça_sayısı, miktarı & date_issued içerdiğini varsayalım.

Tarih verilen sütuna bir dizin ekledim. Ben kesilen_tarih> '20100101', bu gösteriyor NEREDE bir issued_parts SELECT * İZAH çalıştırdığınızda:

 
+----+-------------+----------------+------+-------------------+------+---------+------+---------+-------------+ 
| id | select_type | table   | type | possible_keys  | key | key_len | ref | rows | Extra  | 
+----+-------------+----------------+------+-------------------+------+---------+------+---------+-------------+ 
| 1 | SIMPLE  | issued_parts | ALL | date_issued_alloc | NULL | NULL | NULL | 9724620 | Using where | 
+----+-------------+----------------+------+-------------------+------+---------+------+---------+-------------+ 

yüzden anahtarı görür, ancak bunu kullanmaz? Birisi nedenini açıklayabilir mi?

+0

Bir anahtarın adlandırılması 'anahtar' bunu yapmaz. Soruyu tam olarak anlamadığım halde, bu tür işlevleri istiyorsanız 'anahtar 'sütununu birincil anahtar olarak atayın. Değilse, daha fazla bilgi (örneğin, şu anki şema gibi) sağlamanız gerekecektir. –

cevap

8

Bir şey bana MySQL Sorgu Doktoru'nun doğru karar verdiğini söylüyor.

İşte nasıl anlatabilirsiniz. Bu çalıştırın: aslında alıyorsanız satır sayısı tablonun toplam sayısının, MySQL% 5'ini aşıyorsa Satırlar Kişisel Sorgu

SELECT COUNT(1) FROM issued_parts WHERE date_issued > '20100101'; 

Eşleştirme

SELECT COUNT(1) FROM issued_parts; 

Sayım Rows

Sayım Sorgu Doktoru, tam bir tablo taraması yapmak için daha az çaba harcayacağına karar verir. sorgu daha kesin, örneğin, bu konuda ise

Şimdi:

SELECT * FROM issued_parts WHERE date_issued = '20100101'; 

sonra, farklı bir tamamen planı EXPLAIN alacak.

+0

Cevabınız teknik olarak doğru, ancak "MySQL Query Optimizer doğru karar verdi" değil. Aynı durumda az ya da çok durumdayım ve benim durumumda anahtarın kullanılması (zorlamak) sorguyu çok daha hızlı hale getiriyor. –

+1

200k’dan 1500 kayıt aldım. Hala kullanılabilir anahtar yok. – kellogs

+1

Bende… 709.743'ten 15.080 –

0

possible_keys, ilgili sütunları anahtarlarla girer, ancak bu, içindeki her anahtarın sorgu için yararlı olacağı anlamına gelmez. Bu durumda, hiçbiri.

0

Birden çok türde dizin var (dizinler?). Bir karma endeksi, belirli bir değer verilen bir öğeyi aramanın hızlı bir yoludur. Sorgulamakta olduğunuz bir dizi gizli değerleriniz varsa (örneğin, 10 tarihin bir listesi), o zaman bu değerlerin her biri için bir karma hesaplayabilir ve bunları dizinde görebilirsiniz. Belirli bir değere göre arama yapmadığınızdan, bir karşılaştırma yapmak yerine, bir karma dizini size yardımcı olmayacaktır.

Diğer yandan, bir B-Tree dizini size yardımcı olabilir, çünkü dizine eklediği öğelere bir sıralama verir. Örneğin, buraya bakın: mysql için http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html (B Ağacı Dizini Özellikleri için arama). Tablonuzun dizin sütunu için bir b-ağacı dizini kullandığını kontrol etmek isteyebilirsiniz.