2016-06-12 9 views
2

私は多くのレコードを持つ投稿を持っています。私は今日の記事をユーザーに見せたい、それは約3〜4kです。DATE()MONTH()などの関数のクエリが遅くなります

creation_date - DATETIMEフィールド。このフィールドにはインデックスがあります。クエリで単純なフィルタレコードI私のクエリで

SELECT posts.title AS post_title 
WHERE date(posts.creation_date) = DATE('2016-06-11') 

14秒を実行するこのクエリ。これが起こるのはなぜ

...

SELECT posts.title AS post_title 
WHERE pending_posts.creation_date > CONVERT('2016-06-11', DATETIME) 
AND pending_posts.creation_date < CONVERT('2016-06-11', DATETIME) + INTERVAL 1 DAY 

そして、それは0.2秒をとります。

は、その後、私はそれを変更しましたか? また、MONTH(posts.creation_date)またはYEAR(posts.creation_date)を変換するには、クエリの速度も遅くなるため、月間および年単位で投稿を表示する必要があります。

答えて

3

where節のフィールドで関数を使用することは非常に悪い考えです。これを行うと、MySQLはすべての行(FULL TABLE SCAN)を読み取って、関数の結果と関数の定数を比較する必要があります。

定数部分で関数を使用する方がずっと優れており、その変換は1回だけで、クエリではインデックスを使用できます。

一日

SELECT ... WHERE datetimefield between '2016-01-05 00:00:00' AND '2016-01-05 23:59:59'; 

または

SELECT ... WHERE datetimefield between '2016-01-05 00:00:00' AND '2016-01-05 00:00:00' + INTERVAL 1 DAY 

1ヶ月

SELECT ... WHERE datetimefield between '2016-06-01 00:00:00' AND '2016-06-01 00:00:00' + INTERVAL 1 MONTH; 

のためのあなたは、実行計画では、クエリの作品を見ることができます:

EXPLAIN SELECT posts.title AS post_title 
WHERE date(posts.creation_date) = DATE('2016-06-11'); 

EXPLAIN SELECT posts.title AS post_title 
WHERE pending_posts.creation_date > CONVERT('2016-06-11', DATETIME) 
AND pending_posts.creation_date < CONVERT('2016-06-11', DATETIME) + INTERVAL 1 DAY 
+0

@Artiは - 私は私の答えでいくつかに関する情報を持っています –

関連する問題