Açıklamak cevabı bildiğinde neden (*) yavaş?


14

Bu sorgu: select count(*) from planner_eventçalıştırmak çok uzun zaman alıyor - çok uzun zaman, vazgeçtim ve bitmeden öldürdüm. Ancak, çalıştırdığımda explain select count(*) from planner_event, çıkışta satır sayısı (14m) olan bir sütun görüyorum.

Nasıl açıklanırsa satır sayısını anında alabilir, ancak count (*) çalıştırmak uzun zaman alır?


NEREDE nedeni olmadan COUNT (*), InnoDB motorunda bir tablo taramasına neden olur. COUNT, başlık dosyasında tablo dışında tutulduğu için MyISAM sayıyı doğrudan teslim edebilir.
Raymond Nijland

Yanıtlar:


16

Açıkla, daha önce toplanan istatistikleri kullanıyor (sorgu optimize edici tarafından kullanılıyor). Bir select count(*)okuma her veri bloğunu okur.

Tahmini bir satır sayısı elde etmenin ucuz bir yolu:

select TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES where TABLE_NAME='planner_event';

Yapmış olsanız bile select count(id), ikincil bir dizininiz yoksa id(ayrıca idPRIMARY KEY olduğunu varsayarak ) çok uzun zaman alabilir . Tüm veriler (Satır Verileri dahil) B-Ağacı dizinlerinde depolandığından, a'nın gerçekleştirilmesi select count(PK_COLUMN)hala önemli miktarda G / Ç'dir (tüm veri sayfalarını okuması gerekir). PK alanında ikincil bir dizininiz varsa, bir sayım gerçekleştirmek için daha az IO gerçekleştirebilir.


I_S.TABLES sana aynı verir tahmininiEXPLAIN verir.
Rick James

Sorgu eksik AND TABLE_SCHEMA='my_database', aksi takdirde başka bir veritabanında aynı ada sahip bir tablo varsa birden çok sonuç alırsınız.
cz

3

Açıklama, sayıyı Doktor için bir şeyler tahmin etmek için kullanılan bazı "istatistiklerden" alır. Bu sayı doğru olmaktan uzak olabilir - bazen tam değerden 2 kat daha yüksek (daha yüksek veya daha düşük) olduğunu görüyorum.

Sahne COUNT(*)bir InnoDB'nin masaya meşgul olmak takılı / diğer bağlantıları tarafından silinmiş ancak henüz "kararlı" dır kayıtları yanlış sayma önlemek için tabloyu taramak gerekir. Aslında, bazı indeks üzerinde tam bir tarama yapmak yeterlidir, mutlaka tüm tabloyu içermez (içeren PRIMARY KEY).

Ne kadar RAM'iniz var? Değeri nedir innodb_buffer_pool_size? RAM'in yaklaşık% 70'i olsaydı yardımcı olabilir.

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.