2010-07-19 13 views
7

Aynı sonuçlar ile 2 farklı şekilde ifade edilebilen bir sorgum var. Hangisi daha iyi - performans veya başka nedenlerle?Hangi mySQL tarih sorgusu daha iyi performans gösteriyor?

İlk sorgusu:

SELECT post_id FROM posts 
    WHERE post_date BETWEEN '2010-01-01 00:00:00' AND '2010-12-31 23:59:59' 

İkinci sorgusu: önceden

SELECT post_id FROM posts 
    WHERE YEAR(post_date)=2010 

teşekkürler.


Kıyaslama için öneriden sonra bazı araştırma ve testler yaptım. Testlerim bilgisayarımdaki bazı sorunlar nedeniyle kıyaslama değildi, ancak bana biraz fikir verdiler.

4000 sıralı masamı test ettim ve önemli bir fark yoktu. BETWEEN komutu, 0.09 toplam sorgu zamanında YEAR (post_date) 'den sadece 0.01-0.02 sn daha fazlaydı. YEAR kullanıyor (post_date) hem performans hem de kullanılabilirlik için iyi olurdu.

Ve öğrenirken; saat veya dakika kadar önemli değilse, ARASINDA böyle kullanılabilir:

http://dev.mysql.com/tech-resources/articles/using-new-query-profiler.html

doğru olması için:

SELECT post_id FROM posts 
    WHERE post_date BETWEEN '2010-01-01' AND '2010-12-31' 
+6

neden kendiniz kıyaslamıyorsunuz? – dbemerlin

+0

Caveat: 'BETWEEN '2010-01-01' VE '2010-12-31' 'bir şeyler yapıyor * biraz * şaşırtıcı: Son gününü içermiyor, çünkü içeride" BETWEEN "için genişletildi 2010-01-01 00 : 00: 00 'VE' 2010-12-31 00: 00: 00 '' – Piskvor

+1

@dbemerlin: Çünkü o zaman diğerleri (benim gibi) başkalarının cevaplarını ve sonuçlarını görebilirler. –

cevap

8

post_date üzerinde bir dizininiz varsa (bu sorguyu sık sık çalıştırmak istiyorsanız önerilir), BETWEEN sorgu can use it. Bir sütunu bir işleve ekledikten sonra (YEAR(post_date)), MySQL artık sütunun dizinini kullanmaz, bu nedenle tüm satırlardan geçmesi gerekir (buna full table scan adı verilir).

EXPLAIN SELECT çıktısını sorgularınızla (check this tutorial) kontrol edin ve hangi sonuçları alacağınızı görün - kullanılabilir bir dizin varsa, farkı açıkça görmelisiniz.

Elbette, kodunuzu ölçün ve kendiniz görünün - ancak genel olarak WHERE'deki işlevleri kullanmak daha yavaştır.

+0

Teşekkürler Piskvor. Biraz araştırmam oldu ve sorumu düzenledim. FYI – Kemal

+0

Rica ederim. 4000 satırda, fark gerçekten de alakasız. – Piskvor

2

Her birini alır tam olarak ne kadar görmek için sorgu profiler kullanabilirsiniz Tabii ki, her birini birkaç kez test etmek ve sistemde başka hiçbir şeyin çalışmadığından emin olmak istersiniz. Her iki sorguları kullanılabilir beri basitçe, deneyin -

Cevabınız :) Ben diğer posterleri ile anlaşmak

+0

teşekkürler David. Biraz araştırmam oldu ve sorumu düzenledim. FYI – Kemal

0

ile buraya gelmek için emin olun. Bundan daha iyi bir test yok.

I (her zaman kötü bir fikir olduğu!), O zaman POST_DATE dizine eğer eşleşen satırları almak dizin kullanabilirsiniz, çünkü o zaman ilk hızlı olacaktır derdi daha hızlı olduğu tahmin olsaydı . İndeks yoksa, ikisi arasındaki herhangi bir fark marjinal olacaktır.

+0

Teşekkürler mdma – Kemal

1

Diğerlerinin dediği gibi, göreceli performansı kendiniz ölçebilirsiniz.

SELECT post_id FROM posts WHERE YEAR(post_date)=2010 

çok daha okunabilir diğerinden daha olduğunu ve performans sürece Hep birlikte giderdik bir konudur.

+1

İyi bir nokta - okunabilir, ancak ölçeklemez; birkaç bin satırın üzerinde, performans sorunları olabilir;) – Piskvor

+0

Ben de bunu tercih ederim düşünüyorum^_ ^ – Kemal

İlgili konular