EXPLAIN çıktısı dizinimin kullanılmadığını gösteriyor


9

Ben sadece done_status (done_status = INT) bir dizin ile benim tablo ayarladım:

resim açıklamasını buraya girin

Kullandığımda:

EXPLAIN SELECT * FROM reminder  WHERE done_status=2

Bunu geri alıyorum:

id select_type tablo tipi possible_keys anahtar key_len ref satırları Ekstra
1 BASİT hatırlatma TÜM done_status NULL NULL NULL 5 Nerede kullanma

Ama bu komutu verdiğimde:

EXPLAIN SELECT * FROM reminder  WHERE done_status=1

Aşağıdaki iade olsun:

id select_type tablo tipi possible_keys anahtar key_len ref satırları Ekstra
1 BASİT hatırlatma ref done_status done_status 4 sabit 2   

EXPLAINGösterileri beni o 5 satır, ikinci kez 2 satır kullandığı.

Endeksin kullanıldığını sanmıyorum, eğer doğru anladıysam bana 3 satır vermeli. Neyi yanlış yapıyorum?

SHOW INDEX FROM reminder:

Tablo Non_unique Anahtar_adı Seq_in_index Sütun_adı Harmanlama Kardinalite Alt_bölüm Paketli Boş Dizin_türü Açıklama Dizin_komut
hatırlatma 1 done_status 1 done_status A 5 NULL NULL BTREE

Genişletilmiş açıklama:

id select_type tablo tipi possible_keys anahtar key_len ref satırları filtrelendi Ekstra
1 BASİT hatırlatma ref done_status done_status 4 sabit 2 100.00

show warnings ilgi çekici bir şey göstermedi.


Güven bana dizin çalışır. Ama ekran görüntünüzde kolayca bir şey göremiyorum - "masanızın dizinini göster" yapabilir misiniz

evet

şema için lütfen glorify \ G kullanın ve plan sonucunu açıklayın, daha okunabilir olmalıdır
ajreal

İlgi çekici olmayan bir "açıklamak açıklamak" ve bir "gösteri uyarıları" ile tekrar edebilirsiniz bu gerçek SQL mysql seçer gösterecektir

@ajreal yüceltme nedir?

Yanıtlar:


4

'Satırlar' alanının ne olduğunu yanlış anlıyorsunuz. Sorgunuzu karşılamak için mysql'nin okuması gereken satır sayısıdır. Bu değer oldukça yanlış olabilir. Bu, sonuçtaki satır sayısı veya mysql tarafından okunan gerçek satır sayısı anlamına gelmez.


Yani? Nerede söyledim? Optimize edici ne seçer? Dizin hala çalışıyor.

@ajreal Bu, dizinin bozuk olduğu anlamına gelmez. Sadece optimizer, verileri sorgulamanın en etkili yolunu (zihninde) seçer. Ben OP EXPLAIN satır satır sütun tam olmasını bekliyordum. Bu dizin bozuk olduğu anlamına gelmez - sadece mysql onu kullanmamayı seçer (muhtemelen).

1
@ajreal: Puanlarınızda bir şey eksik. Açıklamanın satırlar sütununun dizinlerle ilgisi yok değil mi? Mysql dizini kullanmamayı seçer (belki tüm veriler tek bir sayfadadır). Demek istediğini anladığımdan emin değil misin? 5 satırlık bir tablodaki sorgu optimizasyonu bazı 'tek' sonuçlar üretecektir, çünkü nasıl optimize ettiğiniz önemli değildir.


Bu durumda, optimize edicinin hangi dizini seçtiği kimin umurunda? Endeksin kendisinde yanlış bir şey yok, çünkü optimizer buna ihtiyaç duymadığını hissetti - ne önemi var?

3

İlk yürütme ovası dizini kesin olarak kullanmaz,
bazı yazma işlemlerinden sonra endeks üzerindeki bilgi_sistemi istatistikleri veriyi yakalamıyor olabilir veya tabloya uzun süre erişilmiyor olabilir.

burada açıklandığı gibi: - MySQL Sorgu Doktoru dizin istatistiklerini nereden okur?

ikinci yürütme planı için, bilgi_sistemi.statistics zaten NULL kardinalite sorunu yakalamak ve çözmek gibi görünüyor.

Bu nedenle, sorguyu dizin optimize edici göre yürütmek olduğunu.

Küçük sıralı masa için çok önemli değil.
Ancak veriler büyüyecek, geliştirici bunu her zaman kontrol etmeli
ve endekste kardinalite ile karşılaşıldığında gerekli analiz tablosunu gerçekleştirmelidir.


0

İlk yürütme planı bir dizin kullanmıyor.

Gönderen MySQL Referans Sitesi :

Bazen MySQL, kullanılabilir olsa bile bir dizin kullanmaz. Bunun gerçekleştiği bir durum, optimize edici, endeksi kullanmanın tablodaki satırların çok büyük bir yüzdesine erişmek için MySQL gerektireceğini tahmin etmesidir. (Bu durumda, daha az arama gerektirdiğinden tablo taraması çok daha hızlı olur.) Ancak, böyle bir sorgu satırların yalnızca bazılarını almak için LIMIT kullanırsa, MySQL zaten bir dizin kullanır, çünkü çok daha hızlı bir şekilde bulabilir sonuçta döndürülecek birkaç satır.

Tablonuzda yalnızca 5 satır varsa ve sorgunuz bunlardan 3 tanesini seçerse, MySQL optimizer tüm tabloyu taramanın daha verimli olduğunu varsayar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.