以下查询用于显示上个星期内点击率最高且过时的“新闻”。
由于该表现在有超过14000条记录,因此查询占用了服务器CPU的大量处理器时间
说明: 1 SIMPLE news ref state state 4 const 20619使用where;使用filesort
的索引:
编辑编辑下拉首页BTREE是否ID 20635 A否
编辑编辑掉落状态BTREE否否状态3 A否
编辑编辑丢弃优先级BTREE否无优先级1 A否
编辑编辑下拉日期BTREE否无日期20635 A是
点击20635 A No.
编辑编辑Drop Drop cat FULLTEXT否No cat 1是
编辑编辑下拉列表标题FULLTEXT否否标题1否
文字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的方式重新编码查询?
答案 0 :(得分:1)
使用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
答案 1 :(得分:0)
嗯,问题是,MySQL必须经过所有14,000条记录并按时间排序才能完成您的请求。您需要索引日期/时间列以使此查询更有效,否则它将使用大量资源,您必须显着升级服务器。