2010-11-20 79 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 2010-11-20 14:47:16

+0

你想要它,因为'user_id'是一个“静态”值,因为'date'被传递给一个函数。 – Danosaure 2010-11-20 17:14:13

+0

请参阅https://dba.stackexchange.com/a/140693/39319如果您担心午夜交易,用户可以更好地解释如何涵盖所有日期和时间段 – 2018-01-09 18:18:33

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)相同,它在效果使索引无效 – 2013-03-20 10:05:22