如何提高MySQL查询的性能?

时间:2010-10-15 15:21:11

标签: mysql indexing filesort

我有一个MySQL查询:

   SELECT DISTINCT 
          c.id, 
          c.company_name, 
          cd.firstname, 
          cd.surname, 
          cis.description AS industry_sector 
     FROM (clients c) 
     JOIN clients_details cd ON c.id = cd.client_id 
LEFT JOIN clients_industry_sectors cis ON cd.industry_sector_id = cis.id 
    WHERE c.record_type='virgin'
 ORDER BY date_action, company_name asc, id desc 
    LIMIT 30

客户端表有大约60-70k行,并且具有“id”,“record_type”,“date_action”和“company_name”的索引 - 遗憾的是,查询仍需要5秒以上才能完成。由于不需要filesort,删除'ORDER BY'会将此减少到大约30ms。有什么办法可以改变这个查询来改善5秒以上的响应时间吗?

4 个答案:

答案 0 :(得分:2)

请参阅:http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

特别是:

  

在某些情况下,MySQL无法使用索引来解析ORDER BY(..)。这些案件包括以下内容:
  (..)
  您正在连接许多表,并且ORDER BY中的列不是来自用于检索行的第一个非常量表。 (这是EXPLAIN输出中第一个没有const连接类型的表。)

答案 1 :(得分:0)

您有id, record_type, date_action的索引。但是如果你想按date_action排序,你真的需要一个索引,其date_action作为索引中的第一个字段,最好与顺序中的确切字段匹配。否则是的,这将是一个缓慢的查询。

答案 2 :(得分:0)

没有看到所有的表格和索引,很难说清楚。在询问有关加快查询的问题时,查询只是等式的一部分。

  • clients上有id索引吗?
  • clients是否有record_type
  • 的索引
  • clients_details上有client_id索引吗?
  • clients_industry_sectors上有id索引吗?

这是您使此查询有机会快速工作所需的最低要求。

答案 3 :(得分:0)

非常感谢您的意见和建议。最后,我决定创建一个新的数据库表,其唯一目的是为了返回结果,因此不需要连接,我只是在向主服务器表添加或删除记录时更新表。从数据存储的角度来看并不理想,但它解决了问题并且意味着我可以非常快速地获得结果。 :)