我的查询导致了一些麻烦。我想知道是否有更好的方法来编写这个SQL;
SELECT * FROM report
WHERE blogid = 1769577
AND DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= datetime
以便更快地获取结果。
提前致谢。
答案 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
表上使用表级锁定。您说每次浏览博客时都会添加新记录。这些频繁的更新可能会导致表级锁定并降低您的选择查询速度。
否则您的查询没问题。
干杯!