2010-11-20 22 views
8

これが私の基本的な日時の構造である:Mysqlで日付時間の検索を最適化する方法は?

primary key(datetime)   key 
auot_id date_time    user_id 
1  2010-10-01 20:32:34 1 
2  2010-10-02 20:32:34 1 
3  2010-11-03 20:32:34 2 
4  2010-10-04 20:32:34 1 
5  2010-11-05 20:32:34 1 

そして、私は'2010-10'day(date_time)の結果を取得したいとuser_id = '1'; 私のSQLは次のとおりです。

SELECT * FROM datetime WHERE user_id = 1 AND DATE_FORMAT(date,'%Y-%m') = '2010-10' 

が、EXPLAINコード表示:

SIMPLE datetime ALL (NULL) (NULL) (NULL) (NULL) 5 Using where 

だから、このコード行は見えません私の検索をより効果的にするためにテーブルを構築するにはどうすればいいですか?

ありがとうございます!

答えて

12

WHERE句の列の関数を使用すると、その列のインデックスを効率的に使用できなくなります。代わりにこれを試してみてください:

SELECT * 
FROM `datetime` 
WHERE user_id = 1 
AND `date` >= '2010-10-01' AND `date` < '2010-11-01' 

(user_id, date)にインデックスを追加します。

+1

私はmysqlを初めて使用しています。だから私はどんな種類のインデックスを付け加えるべきかわからないのですか?私はそれらのインデックスを作成したと思います:INDEX 'date'(' date'、 'user_id') – qinHaiXiang

+0

' date'が関数に渡されるので、 'user_id'が「静的」なので、 。 – Danosaure

+0

https://dba.stackexchange.com/a/140693/39319を参照してください。真夜中取引が懸念される場合は、すべての日付と時間帯をどのようにカバーするかを説明します –

2
SELECT * 
FROM yourTable 
WHERE datatime 
BETWEEN '2010-10-01' AND '2010-11-01' 

効率的でインデックス付けも受け入れます。

0

方法について:

WHERE CAST(datatime AS DATE) = '2010-10-01' 

それとも

WHERE CAST(datatime AS DATE) = CAST('2010-10-01' AS DATE) 

は、それはあまりにも非効率的だろうか?

+1

これはDATE(datatime)とまったく同じです。効果がインデックスを無効にする –

関連する問題