我有一个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
以下是当前的统计数据:
表内容有55k行
表操作有87k行
对于内容,我有以下索引:
父id(父id)
用户id(用户id)
类型状态日期(类型、状态、日期)
type_status_updatedate(类型、状态、更新日期)
站点id(站点id)
类型状态级别(类型、状态、级别)
输入父id级别(类型,父id,级别)
对于操作,我有以下索引:
主id(主id)
站点id(站点id)
类型(类型)
任何帮助和建议将不胜感激。
谢谢大家!
最佳答案
由于您正在执行“按c.date更新的订单描述限制20”,您可能需要更新c.date上的索引。这样,mysql可以按相反的顺序首先扫描该表,并在得到20行时立即停止。
您绝对应该使用date_updated
检查更改前后的查询,以查看优化器是否选择了该顺序。如果优化器没有自然地选择索引,那么可以强制使用EXPLAIN
索引。