慢sql查询 - 根据日期间隔选择数据

时间:2011-01-15 07:21:05

标签: mysql datetime

我的查询导致了一些麻烦。我想知道是否有更好的方法来编写这个SQL;

 SELECT * FROM report 
 WHERE blogid = 1769577 
      AND DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= datetime 

以便更快地获取结果。

提前致谢。

4 个答案:

答案 0 :(得分:2)

我没有看到查询有任何问题,但你可以确保在blogid和datetime列上有索引

如果您的表格很大,您可能会考虑水平分区,这会对性能产生重大影响。见http://dev.mysql.com/tech-resources/articles/performance-partitioning.html

答案 1 :(得分:0)

在Oracle SQL中,您可以通过+/-运算符进行日期算术运算。我不知道它是否适用于MySQL,但您也可以尝试使用datetime&gt; =(CURDATE() - 30)。

SELECT * FROM report WHERE blogid = 1769577 AND datetime >= (curdate() - 30)

编辑:此博客条目似乎证实了我的建议:http://mysql-tips.blogspot.com/2005/04/mysql-date-calculations.html

答案 2 :(得分:0)

我建议使用内部的datediff()函数而不是减去间隔。像这样:

datediff(curdate(), datetime) < 30

所以查询是:

SELECT * FROM report WHERE blogid = 1769577 AND datediff(curdate(), datetime) < 30

答案 3 :(得分:0)

猜猜1:您的blogid不是int列。然后你可以阅读MySQL手册:

  

不同列的比较可能   防止在值时使用索引   无法直接比较   转换。假设是一个数字   列与字符串列进行比较。   对于给定的值,例如1中的1   数字列,它可能比较相等   到字符串中的任意数量的值   列,例如'1','1','00001'或   '01 .e1' 。这排除了任何使用   字符串列的索引。

猜猜2:您的blogid未编入索引。

猜猜3:报告表是myisam。在这种情况下,当您修改数据时,MySQL在整个reports表上使用表级锁定。您说每次浏览博客时都会添加新记录。这些频繁的更新可能会导致表级锁定并降低您的选择查询速度。

否则您的查询没问题。

干杯!