新鲜事首页有调用最新主题20条的数据,走的 function getLatestThreads($forumIds, $starttime, $endtime, $offset, $limit)
但是在\mode\o\lib\squareservice.class.php 中使用这个getLatestThreads函数的时候却没有指定开始和结束时间,导致结果是把主题表进行了全表数据的filesort。如果站点有百万条主题帖就是百万条 filesort。这肯定是一个严重的slow query。
解决方法:
在\mode\o\lib\squareservice.class.php 查找
$data = $service->getLatestThreads($openforum, '', '', 0,$limit);
改成
$data = $service->getLatestThreads($openforum, time()-604800, time(), 0,$limit);
原理,加上开始和结束时间,提取一个星期内的最新帖子进行 order by。 减少filesort的row数量。
如何避免
在做order by类似的sql语句时候 一定要注意,大数据量的表要使用where 缩小order by前获取到的row数量,避免大批量的数据进行filesort