我有一个MySQL查询,当前运行时间为2.5秒,我想将其减少到最多2秒。
以下是查询:
SELECT SQL_CALC_FOUND_ROWS Distinct(c.id)
FROM `content` c
INNER JOIN `actions` AS action
ON c.parent_id = action.primary_id
WHERE 1 = 1
AND c.site_id IN ( 1, 2 )
AND c.type IN ( 'topic' )
AND c.status = 'visible'
AND ( c.lock = 0
OR c.site_id = 1 )
AND ( c.level IN ( 0 )
OR ( c.level IN ( 10 )
AND action.user_id = 123
AND action.type IN ( 'group_follow' ) ) )
ORDER BY c.date_updated DESC
LIMIT 20
以下是目前的统计数据:
对于内容,我有索引:
对于操作,我有索引:
非常感谢任何帮助和建议。
全部谢谢!
答案 0 :(得分:1)
由于您正在执行“ORDER BY c.date_updated DESC LIMIT 20”,因此您可能需要c.date_updated的索引。这样,mysql可以以反向date_updated
顺序扫描该表,并在获得20行后立即停止。
在更改之前和之后,您一定要使用EXPLAIN
检查查询,以查看优化程序是否选择了该顺序。如果优化器没有自然地选择它,有很多方法可以强制使用date_updated
索引。
答案 1 :(得分:0)
在where子句中你必须有订单。第一个必须是具有索引的列。
例如索引 type_status_updateddate(type,status,date_updated)
如果我们写
where status = 'blabla' and type = '1'
指数不使用坚果
where type='1' and status='blala'
使用索引。
如果列在索引中(在多列索引中),则mysql使用索引。 例如索引 type_status_updateddate(type,status,date_updated)
如果我们写 where status ='blablabla' 索引没有使用
这个事实确实使用多列索引而不是很酷
和
c.type IN ( 'topic' )
可以替换
c.type = 'topic'
抱歉我的英语。