8

22 milyon kayıt bulunan büyük bir tablom var. Ben istediğinizdeMySQL sorgusu ile büyük inverval tarihi

: Ben sorgu yürütme planı analiz etmek başlattıktan sonra

CREATE INDEX endDate_index USING BTREE ON alerts_stat(endDate) 

:

select auto_alerts from alerts_stat where endDate > "2012-12-01" 

Ben endData alan için B-ağacı indeks eklendi performansını artırmak için: sonraki sorguyu yürütmek istiyor Şu ana kadar 15'den 7 güne kadar olan parametreleri al:

explain select alerts_sp from alerts_stat 
where endDate between CURDATE() - 15 and CURDATE() - 7; 

2.762.088 satırı işlemek için bir sonraki çalıştırma planım var.

'1', 'SIMPLE', 'browser_plugin_alerts_stat', 'range', 'endDate_index', 'endDate_index', '4', NULL, '2762088', 'Using where' 

Ben bir gün aralığı artırmak

i aldı:
explain select alerts_sp from alerts_stat 
where endDate between CURDATE() - 15 and CURDATE() - 6; 

MySQL planı tüm 22923126 satırları işlemek için sözü açıklar. Örneğin, WHERE işlemi 22,925,642'de herhangi bir koşul olmaksızın seçim yapın.

Yürütme planını geliştirebilir miyim? Belki bir yerde hatam var, ya da normal MySQL behaivior?

cevap

3

Sonuç kümesi tüm satırların% 8-9'unu aştığında, MySQL tam tablo taraması yapar. Bana göre, bir gün tam tablo tarama yönünde MySQL salıncak eklersiniz. Sonuçların daha iyi olup olmadığını görmek için dizini zorlamayı deneyebilirsiniz.

GÜNCELLEME: Okuduğum kadarıyla

, MySQL sorgu iyileştirici böyle sınırda vakalarda yanlış seçim eğilimindedir, bu nedenle kolayca bir dizin zorlayarak daha iyi işe yarayabilir. Aksi halde, bu basit bir sorgudur ve optimizasyon için daha fazla yer yok.

Belki bu iki sütun üzerinde bir Covering index oluşturmak ve kullanımını zorlamak en iyi sonucu verebilir.

+0

Teşekkürler. Benim durumum olduğunu düşün. Yani MySQL özel davranış. Büyük bir aralık için örnek toplamı ('alertts_sp') ​​almak için sorguyu bir şekilde geliştirebilir miyim? – Taky