我们有一张不同的大桌子。例如 - 3000行数据。
我们需要选择域status < 4
的所有行。
我们知道相关行将从2个月前开始最大化(每行有一个日期列的诅咒)。
此查询是否最有效?
SELECT * FROM database.tableName WHERE status<4
AND DATE< '".date()-5259486."' ;
(date() - php,5259486 - 两个月。)...
答案 0 :(得分:1)
假设您将日期存储为DATETIME
,您可以尝试这样做:
SELECT * FROM database.tableName
WHERE status < 4
AND DATE < DATE_SUB(NOW(), INTERVAL 2 MONTHS)
此外,为了优化搜索查询,您可以使用EXPLAIN
(http://dev.mysql.com/doc/refman/5.6/en/explain.html),如下所示:
EXPLAIN [your SELECT statement]
您可以调整响应时间的另一点是仔细放置适当的索引。
索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找相关行。表越大,成本越高。如果表中有相关列的索引,MySQL可以快速确定要在数据文件中间寻找的位置,而无需查看所有数据。
以下是一些解释&amp;有关MySQL索引的教程:
但是,请记住,使用TIMESTAMP代替DATETIME更有效;前者是4个字节;后者是8.它们持有相同的信息(时区问题除外)。
答案 1 :(得分:0)
对于数据库来说,3,000行数据并不大。实际上,它位于 small 方面。
查询:
SELECT *
FROM database.tableName
WHERE status < 4 ;
应该在3,000行上快速运行,除非每行非常非常大(比如说10k)。您始终可以在status
上添加索引,以使其运行得更快。
cassi.iup建议的查询更有意义:
SELECT *
FROM database.tableName
WHERE status < 4 AND DATE < DATE_SUB(NOW(), INTERVAL 2 MONTHS);
使用status, date
上的复合索引,效果会更好。我的问题是:您是否希望所有状态为4的行,或者您希望过去两个月中所有行的状态为4?在第一种情况下,您必须不断更改查询。你会更好:
SELECT *
FROM database.tableName
WHERE status < 4 AND DATE < date('2013-06-19');
(截至我写这篇文章的日期。)