`SELECT r.*, u.username
FROM `reservation` AS r JOIN
     `users` AS u
WHERE u.id = r.user_id
AND   DATE(r.bx_date) >= DATE('2012-08-22')
AND   DATE(r.bx_date) <= DATE('2012-08-22')
AND   r.status='1'
ORDER BY r.id desc`


表保留包含500,000条记录,并且bx_date从2012-01-01到2013-01-01不等。用户表中有40,000条记录。 bx_date是“日期”类型。

在上面的查询中,如果我尝试过类似2012-08-22的日期,则需要8秒钟。但是,如果我尝试2013年1月1日,则大约需要1秒。

是什么原因 ?

谢谢

最佳答案

最可能的原因是索引编制或索引维护不正确。

您应该有一个索引,例如:

CREATE INDEX reservation_ndx ON reservation
    (status, bx_date, user_id)


另外,如果使用InnoDB,请尝试运行

ANALYZE TABLE reservation;


为了让系统更新表格的受众特征。

另一个可能的原因(但恕我直言不太可能)的原因可能是表分区:

 http://dev.mysql.com/doc/refman/5.1/en/partitioning-types.html


看到reservation可能会随着时间逐渐增加。

更新:我没有提到明显的原因,一个查询可能返回一百万条记录,另一个查询立即失败,但是,如果您不知道SQL结果是什么(也许您只是在运行“盲目”基准测试,仅检查执行时间),这也有可能。 (更新时更新:我刚刚读到两个查询都返回相同数量的行。然后排除了此原因)

10-06 02:16