以下查询用于显示上周点击率最高的"新闻"。
由于该表现在有14000多条记录,该查询消耗了服务器CPU 的大量处理器时间
解释:1 SIMPLE news ref state state 4 const 20619使用where;使用文件端口
索引:
编辑编辑拖放PRIMARY BTREE是否id 20635 A否
编辑编辑拖放状态BTREE否状态3 A否
编辑编辑拖放优先级BTREE没有优先级1 A没有
编辑编辑拖放日期BTREE否日期20635 A是命中20635 A否Edit Edit Drop Drop cat FULLTEXT No No cat 1 Yes编辑编辑拖放标题FULLTEXT没有标题1没有
text 1无
$timeago = strtotime("-1 week");
SELECT id, title, sub_title, date, image_url, hits, text, comment
FROM news
WHERE state = '2'
ORDER BY date >= $timeago DESC, hits DESC
LIMIT 6
我的问题是,如何以避免大量消耗CPU的方式对查询进行重新编码?
使用explain plan查看发生了什么。你至少会创建一个日期或日期的索引,然后点击
更新我认为下面也会更好,
SELECT id, title, sub_title, date, image_url, hits, text, comment
FROM news
WHERE state = '2' and date >= $timeago
ORDER BY date DESC, hits DESC
LIMIT 6
问题是,MySQL必须遍历所有14000条记录并按时间排序才能完成您的请求。您需要对日期/时间列进行索引以提高查询效率,否则将占用大量资源,并且您必须大幅升级服务器。