0

假设我们有一个不同的大表。例如 - 3000 行数据。我们需要选择该字段的所有行status < 4。我们知道相关行将在 2 个月前达到最大值(诅咒每一行都有一个日期列)。

这个查询是最有效的吗?

SELECT * FROM database.tableName WHERE status<4 

AND DATE< '".date()-5259486."' ;

(日期() - php,5259486 - 两个月。)...

4

2 回答 2

1

假设您将日期存储为DATETIME,您可以试试这个:

SELECT * FROM database.tableName
WHERE status < 4
  AND DATE < DATE_SUB(NOW(), INTERVAL 2 MONTHS)

此外,为了优化搜索查询,您可以像这样使用EXPLAINhttp://dev.mysql.com/doc/refman/5.6/en/explain.html):

EXPLAIN [your SELECT statement]

您可以调整响应时间的另一点是仔细放置适当的索引。

索引用于快速查找具有特定列值的行。如果没有索引,MySQL 必须从第一行开始,然后读取整个表以查找相关行。桌子越大,成本越高。如果表有相关列的索引,MySQL 可以快速确定要在数据文件中间寻找的位置,而无需查看所有数据。

以下是关于 MySQL 索引的一些解释和教程:

但是,请记住,使用 TIMESTAMP 而不是 DATETIME 更有效;前者为4字节;后者是 8。它们拥有相同的信息(时区问题除外)。

于 2013-08-19T12:52:03.127 回答
0

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');

(截至我写这篇文章的日期。)

于 2013-08-19T13:08:45.187 回答