提高MySQL查询的性能

时间:2012-12-22 00:15:05

标签: 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 ) 
       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行

对于内容,我有索引:

  • parent_id(parent_id)
  • user_id(user_id)
  • type_status_date(类型,状态,日期)
  • type_status_updateddate(type,status,date_updated)
  • site_id(site_id)
  • type_status_level(类型,状态,级别)
  • type_parentid_level(type,parent_id,level)

对于操作,我有索引:

  • primary_id(primary_id)
  • site_id(site_id)
  • type(type)

非常感谢任何帮助和建议。

全部谢谢!

2 个答案:

答案 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' 
抱歉我的英语。