2012-11-27 17 views
7

Bir örtme indeksi daily_ipsCOUNT (DISTINCT field1) performansının nasıl artırılacağı ... GROUP BY field2?

Table  Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment 
requests 1   daily_ips 1    exec_date A   16   NULL  NULL YES BTREE  
requests 1   daily_ips 2    ip_address A   483492  NULL  NULL YES BTREE  

ile aşağıdaki sorgu

EXPLAIN SELECT COUNT(DISTINCT ip_address) as ip_address, exec_date 
    FROM requests 
    GROUP BY exec_date; 

id select_type table  type  possible_keys key   key_len ref  rows Extra 
1 SIMPLE  requests range  NULL   daily_ips 263  NULL 488213 Using index for group-by (scanning) 

ben daha bu sorguyu optimize edebilirsiniz herhangi bir yolu var mı var?

Using index for group-by (scanning) tam olarak ne anlama geliyor? İfadenin COUNT(DISTINCT ip_address) kısmı olmasa da, tüm GROUP BY tümcenin tamamen bir dizinden yapıldığı anlamına mı geliyor?

cevap

3

Sağladığınız verilere dayanarak, sorguyu daha fazla optimize etmenin herhangi bir yolunu göremiyorum. Takip altında soruya şöyle

, Using index for group-by için çıktıyı açıklamak anlatan MySQL'in manuel sayfanın mesajı:

kullanarak indeks tablo erişim yöntemine benzer grupta-by için endeksini kullanarak MySQL bir dizin bulduğunu gösterir gerçek tabloya herhangi bir ekstra disk erişimi olmadan bir GROUP BY veya DISTINCT sorgusunun tüm sütunlarını almak için kullanılabilir. Ek olarak, indeks en verimli şekilde kullanılır, böylece her grup için sadece birkaç dizin girişi okunur. Ayrıntılar için bkz. Section 8.13.10, “GROUP BY Optimization”.

Dizininiz özellikle sorgunuzu hızlandırmak için çok uygundur. Yalnızca dizine eklenmiş alanlar seçildiğinden (sorgunuzdaki her sütun da dizinde görünür), MySQL'in ilgili tüm veriler dizinde göründüğü için tabloya bile gerek duymayabilir.

Bir sorguyu yürütmek, google'da bir arama yapmak gibiyse, aradığınız bilgileri doğrudan arama sonuçlarında bulduğunuz için, bağlantı verilen sitelerden herhangi birine tıklamak zorunda kalmadığınızı düşünün. Tablo verilerini taramak gerekiyor. İşte how MySQL uses indexes üzerine birtakım bilgiler verilmiştir: Bazı durumlarda

, bir sorgu veri satırlarını danışmadan değerleri almak için optimize edilebilir. (Bir sorgu için gerekli tüm sonuçları sağlayan bir indekse covering index olarak adlandırılır.) Bir sorgu, yalnızca sayısal olan ve bazı anahtar için en soldaki öneki oluşturan bir tablonun sütunlarını kullanıyorsa, seçilen değerler dizin ağacından alınabilir fazla hız için:

SEÇkey_part3tbl_namekey_part1 = 1

+1

Teşekkürler Danny, meraktan çıkmış olursam, '' group-by (scan '') için indeks kullanılması 'GROUP-BY' ya da' DISTINCT' maddesine uygulanan indekse değinirse, anlayabileceğim herhangi bir yol var mı? – user784637

+0

DISTINCT sadece [GROUP BY' özel bir durum] olduğundan (http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html) ve her iki sütun da aynı tablo, aynı endeks, emin değilim. –

0

You DAN Nesne: Nesne belirleme nesnesini = ObjectifyService.begin(); Sorgu sorgu = ofy.query (burada sınıf name.class) .filter ("tablodaki sütun adı", sorgulanacak değer) .list();

Bundan önce Objectify nesnesini eklemeniz gerekebilir.