最大化SQL SELECT语句的效率

时间:2013-08-19 12:46:24

标签: mysql sql performance

我们有一张不同的大桌子。例如 - 3000行数据。 我们需要选择域status < 4的所有行。 我们知道相关行将从2个月前开始最大化(每行有一个日期列的诅咒)。

此查询是否最有效?

SELECT * FROM database.tableName WHERE status<4 

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

(date() - php,5259486 - 两个月。)...

2 个答案:

答案 0 :(得分: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可以快速确定要在数据文件中间寻找的位置,而无需查看所有数据。

以下是一些解释&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');

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