2016-04-11 55 views
1

15 milyondan 20 milyona kadar satır içeren bir MySql tablom var. Geçmişteki performansını% 100'ün üzerinde artırmak için veri bölümlemesini kullandım. Ancak, şu sorguyu çalıştırdığımda, queru'nun çalışması için 60 saniyenin üzerinde bir zaman aldı.MySQL sorgusu çok yavaş

select state, gender, count(*) from big_data where gender in ('Sugar Daddy','Sugar Baby') group by state, gender 

Sonucu buldum açıklamada

[SQL]select state, gender, count(*) from big_data where gender in ('Sugar Daddy','Sugar Baby') group by state, gender 

Affected rows: 0 
Time: 59.390s 

: zamanın % 99 geçici tabloya kopyalanması aldı! Bu sorgunun performansını nasıl artırabilirim?

enter image description here enter image description here

Şema & açıklar: Bir IN yana

enter image description here

enter image description here

+0

Bir IN kullandığınızdan emin olmak için birden çok değerlendirme yapmak zorunda olduğu gibi yavaş olacaktır. Bir dize tipi sütun üzerinde özel. Başka bir şekilde devam edemez misin? Masanızda endeks var mı? –

+1

Dizine ihtiyacınız var (cinsiyet, durum). Lütfen tablo şemasını ve EXPLAIN sonucunu gönderin. –

+0

Yep, dizin tanımlandı. –

cevap

0

gerçekten paraphrased OR listedir, bir yararlanmak için yerine bir UNION deneyebilirsiniz gender; gibi pek:

select state, gender, count(*) 
from big_data 
where gender = 'Sugar Daddy' 
group by state 
UNION 
select state, gender, count(*) 
from big_data 
where gender = 'Sugar Baby' 
group by state 
order by state, gender 
0

Sen gender sütun üzerinde en az bir dizin gerekir ki, bu WHERE yan tümcesi için kullanılabilir. Ancak, WHERE koşuluna uyan çok fazla satır varsa, GROUP BY için sıralama da pahalı olabilir. Dolayısıyla, bir endeks (cinsiyet, durum) daha iyi olurdu ve sorgunuz yalnızca bu dizini çalıştırırdı. state zaten PK'nin bir parçası olduğundan, bu indeks daha fazla yer kaplamıyor çünkü PK her zaman InnoDB'deki herhangi bir dizinin bir parçası.

Additonaly, genders tablosunu (gender_id, gender_name) oluşturmanızı ve büyük tablonuzda genders.gender_id referansını gösteren bir yabancı anahtar kullanmanızı öneririm. Bu masa ve endeksi küçük tutuyor.