我不擅长优化 SQL,但我需要这个查询尽可能快地运行。它将通过 PHP 脚本在大约 40 个不同的数据库上重复运行。然后 PHP 按时间顺序对结果进行排序。
SELECT DATE_FORMAT(lastmoddate, '%a %b %D, %Y %l:%i%p') as lastmod,
count(*) as num_modified,
(select count(*) from store.item) as totalitems,
UNIX_TIMESTAMP(lastmoddate) as timestamp
FROM store.item
group by lastmoddate
HAVING lastmoddate = MAX(lastmoddate)
order by lastmoddate desc
limit 1;
解释
- lastmoddate是项目记录的最后修改日期
- count(*) as num_modified是上次更新时修改的项目数
- 子查询获取表中的项目总数
- UNIX_TIMESTAMP可能是不必要的,但我稍后在 PHP 中使用它进行排序。该结果与来自其他数据库的结果合并,然后进行排序。
所以最终目标是获取一个包含上次修改日期、在上次修改日期修改的项目数以及数据库中的总项目数的表。
子查询可能会被删除,但它似乎对速度影响不大。需要其他结果。如果 DATE_FORMAT 或 UNIX_TIMESTAMP 很慢,它们可以被删除,但它们会被 PHP 中的一些可能同样慢的东西所取代。(就像我说的,我对优化 SQL 没有任何兴趣。我感觉很好,只是获得了一个有效的查询。)
MySQL 5.5 和 PHP 5.3