假设我们有一个不同的大表。例如 - 3000 行数据。我们需要选择该字段的所有行status < 4
。我们知道相关行将在 2 个月前达到最大值(诅咒每一行都有一个日期列)。
这个查询是最有效的吗?
SELECT * FROM database.tableName WHERE status<4
AND DATE< '".date()-5259486."' ;
(日期() - php,5259486 - 两个月。)...
假设我们有一个不同的大表。例如 - 3000 行数据。我们需要选择该字段的所有行status < 4
。我们知道相关行将在 2 个月前达到最大值(诅咒每一行都有一个日期列)。
这个查询是最有效的吗?
SELECT * FROM database.tableName WHERE status<4
AND DATE< '".date()-5259486."' ;
(日期() - php,5259486 - 两个月。)...
假设您将日期存储为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 可以快速确定要在数据文件中间寻找的位置,而无需查看所有数据。
以下是关于 MySQL 索引的一些解释和教程:
但是,请记住,使用 TIMESTAMP 而不是 DATETIME 更有效;前者为4字节;后者是 8。它们拥有相同的信息(时区问题除外)。
3,000 行数据对于数据库来说并不大。事实上,它是在小的方面。
查询:
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');
(截至我写这篇文章的日期。)