提高MySQL查询的性能

提高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 )

我有一个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)
  • 类型\状态\日期(类型、状态、日期)
  • 类型\状态\更新日期(类型、状态、更新日期)
  • 站点id(站点id)
  • 类型\状态\级别(类型、状态、级别)
  • 类型\父id \级别(类型、父id、级别)
对于操作,我有以下索引:

  • 主id(主id)
  • 站点id(站点id)
  • 类型(类型)
任何帮助和建议都将不胜感激

谢谢大家

由于您正在执行“按c.date\u更新的描述限制20”的订单,您可能需要更新c.date\u的索引。通过这种方式,mysql可以先反向扫描该表
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
可能会显著提高性能。你真的需要它吗?