2013-03-14 24 views
5

Tablo, InnoDB tablosundadır. İşte size yardımcı olabilecek bazı bilgiler.MySQL sorgusu çok yavaş. Endekslenmiş sütuntaki (*) sayısı

EXPLAIN SELECT COUNT(*) AS y0_ FROM db.table this_ WHERE this_.id IS NOT NULL; 

+----+-------------+-------+-------+---------------+---------+---------+------+---------+--------------------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref | rows | Extra     | 
+----+-------------+-------+-------+---------------+---------+---------+------+---------+--------------------------+ 
| 1 | SIMPLE  | this_ | index | PRIMARY  | PRIMARY | 8  | NULL | 4711235 | Using where; Using index | 
+----+-------------+-------+-------+---------------+---------+---------+------+---------+--------------------------+ 
1 row in set (0.00 sec) 

mysql> DESCRIBE db.table; 
+--------------+--------------+------+-----+---------+-------+ 
| Field  | Type   | Null | Key | Default | Extra | 
+--------------+--------------+------+-----+---------+-------+ 
| id   | bigint(20) | NO | PRI | NULL |  | 
| id2   | varchar(28) | YES |  | NULL |  | 
| photo  | longblob  | YES |  | NULL |  | 
| source  | varchar(10) | YES |  | NULL |  | 
| file_name | varchar(120) | YES |  | NULL |  | 
| file_type | char(1)  | YES |  | NULL |  | 
| created_date | datetime  | YES |  | NULL |  | 
| updated_date | datetime  | YES |  | NULL |  | 
| createdby | varchar(50) | YES |  | NULL |  | 
| updatedby | varchar(50) | YES |  | NULL |  | 
+--------------+--------------+------+-----+---------+-------+ 
10 rows in set (0.05 sec) 

sorgu orada bana sonucunu verir açıklar. Ancak asıl sorgu oldukça uzun bir süredir çalışıyor. Bunu nasıl düzeltebilirim? Neyi yanlış yapıyorum?

Bu tabloda kaç tane photos bulunduğunu anlamaya ihtiyacım var. Başlangıçta orijinal kodlayıcı, WHERE photo IS NOT NULL'u (3 saat + aldı) kontrol eden bir sorguya sahipti, ancak bu anahtarı, birincil anahtar olduğu için id sütununu kontrol etmek için değiştirdim. Orada büyük bir performans artışı bekledim ve bir saniyede bir cevap bekliyordum ama bu durum böyle değil.

Veritabanında ne tür bir optimizasyon yapmam gerekiyor? Sorgunun iyi olduğunu düşünüyorum ama yanılıyorsam beni düzeltmekten çekinmeyin.

Düzenleme: redhat-linux-gnu (x86_64) mysql Ver 14.14 Distrib 5.1.52, taleb 5,1

P.S. kullanarak: Ben gibi saçma sapan bir tablo adını. Aslında db adlı veritabanına ve söz konusu tabloya ait tabloya sahip değilim.

+0

Nasıl 'gerçekleştirmek db.table' GELEN COUNT (*) SEÇ geliyor? ('Id' boş olmayan olduğundan, geçerli sorgula eşdeğerdir.) – ruakh

+0

Hatalı. 10 dakikadan fazla sürüyor (emin olamadım ama ne kadar bekledim). – Sanchit

cevap

9

'Uzun' ne kadar? Bu tabloda kaç tane satır var?

bir MyISAM tablo öylesine basit bir COUNT (*) her zaman neredeyse anında geri dönecektir, bu kaç satır izler.

InnoDB, diğer taraftan farklı şekilde çalışır: bir InnoDB tablosu kaç tane satır olduğunu ve COUNT (*) karakterini kullandığınızda tam anlamıyla her satırın gitmesi ve sayması gerekir. Büyük bir tablonuz varsa, bu birkaç saniye sürebilir.

DÜZENLEME: COUNT(*) yerine, ID içinde NULL'leri olmayan dizinli bir sütun olan COUNT(ID) deneyin. Bu , daha hızlı çalışabilir.

EDIT2: Dosyaların uzun veri bloğundaki ikili verilerini saklıyorsanız, tablonuz çok büyük olacaktır ve bu da işleri yavaşlatır.

Olası çözümler: yerine InnoDb ait

  1. kullanın MyISAM.
  2. Belki de ekler ve silme işlemlerinde tetikleyiciler kullanarak kendi sayınızı koruyun.
  3. İkili verileri başka bir tabloya veya tercihen normal dosyalara ayırın.
+0

InnoDB, 4.7million satırlık bir tabloya ne kadar süre dayanır? Açıklama ifadesi bana bir saniyeden kısa sürede cevapımı veriyor! – Sanchit

+0

Evet, aslında bu sadece bir tahmin! http://dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html – aidan

+0

4.7m satırlarındaki bir sayım sorgusunun ne kadar süreceğinden emin değilim çünkü CPU gibi başka şeylere bağlı olacaktır. hız, CPU yükü, vb, ama belki 5 saniye? – aidan