提高MySQL查询的性能
我有一个MySQL查询,当前运行时间为2.5秒,我想把它缩短到最多2秒 以下是查询:提高MySQL查询的性能,mysql,performance,optimization,Mysql,Performance,Optimization,我有一个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 )
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)
- 类型\状态\日期(类型、状态、日期)
- 类型\状态\更新日期(类型、状态、更新日期)
- 站点id(站点id)
- 类型\状态\级别(类型、状态、级别)
- 类型\父id \级别(类型、父id、级别)
- 主id(主id)
- 站点id(站点id)
- 类型(类型)
date\u updated
顺序,并在得到20行数据后立即停止
您肯定应该使用EXPLAIN
检查更改前后的查询,看看优化器是否选择了该顺序。如果优化器没有自然选择,有一些方法可以强制使用date\u updated
索引。因为您正在执行“ORDER BY c.date\u updated DESC LIMIT 20”,您可能需要更新c.date\u的索引。通过这种方式,mysql可以先反向扫描该表date\u updated
顺序,并在得到20行数据后立即停止
您肯定应该使用
EXPLAIN
检查更改前后的查询,看看优化器是否选择了该顺序。如果优化器没有自然选择,可以使用date\u updated
索引。在where子句中,您必须有顺序。firsts必须是具有索引的列
例如索引
类型\状态\更新日期(类型、状态、更新日期)
如果我们写
where status = 'blabla' and type = '1'
不使用螺母的索引
where type='1' and status='blala'
使用索引
mysql在索引中保留列时使用索引(在多列索引中)。
例如索引
类型\状态\更新日期(类型、状态、更新日期)
如果我们写
其中status='blabla'
索引未使用
使用多列索引并不酷
及
可在上更换
c.type = 'topic'
对不起,我的英语不好。在where子句中,您必须有顺序。firsts必须是具有索引的列 例如索引 类型\状态\更新日期(类型、状态、更新日期) 如果我们写
where status = 'blabla' and type = '1'
不使用螺母的索引
where type='1' and status='blala'
使用索引
mysql在索引中保留列时使用索引(在多列索引中)。
例如索引
类型\状态\更新日期(类型、状态、更新日期)
如果我们写
其中status='blabla'
索引未使用
使用多列索引并不酷
及
可在上更换
c.type = 'topic'
对不起,我的英语不好。请运行
解释并提供返回的信息。此SQL是自动生成的还是您可以随意更改它?1=1的有什么问题?当只有一个条件时,为什么您在中使用而不是=
?这些列的条件数是否会更改?您可以随时更改。删除SQL\u CALC\u FOUND\u ROWS
可能会显著提高性能。你真的需要它吗?请运行解释
并提供返回的信息。这个SQL是自动生成的还是你可以随意更改它?1=1的是怎么回事?当只有一个条件时,你为什么要在中使用而不是=
?这些列的条件数是否会更改?您可以随时更改。删除SQL\u CALC\u FOUND\u ROWS
可能会显著提高性能。你真的需要它吗?