【问题标题】:How can I improve the performance of this MySQL query?如何提高这个 MySQL 查询的性能?
【发布时间】:2010-10-15 15:21:11
【问题描述】:

我有一个 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

clients 表有大约 60-70k 行,并有一个索引“id”、“record_type”、“date_action”和“company_name” - 不幸的是,查询仍然需要 5 多秒才能完成。由于不需要文件排序,因此删除“ORDER BY”会将其减少到大约 30 毫秒。有什么方法可以更改此查询以改善 5 秒以上的响应时间?

【问题讨论】:

  • 对查询运行 EXPLAIN。它将向您显示要完成的所有步骤以及必须处理的行数。如果您可以发布,我可能会给您一个更好的答案。
  • 索引——它们是独立的还是单一的覆盖索引?
  • 嗨@Cfreak,我已经对查询进行了解释,我得到:1 SIMPLE c range PRIMARY,record_type record_type 2 NULL 67836 Using where;使用临时的;使用文件排序 1 SIMPLE cd ref client_id client_id 4 ihasco_live.c.id 1 1 SIMPLE cis eq_ref PRIMARY PRIMARY 4 ihasco_live.cd.industry_sector_id 1
  • @OMG Ponies:索引都是独立的。 :)

标签: mysql indexing filesort


【解决方案1】:

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

特别是:

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

【讨论】:

  • 我已经根据上述情况改变了我的方法,感谢您的指点。 :)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    如果不查看所有表和索引,就很难判断。当询问有关加快查询速度的问题时,查询只是方程式的一部分。

    • clientsid 上有索引吗?
    • clientsrecord_type 上有索引吗
    • clients_detailsclient_id 上有索引吗?
    • clients_industry_sectorsid 上有索引吗?

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

    【讨论】:

    • 嗨,安迪,是的,客户有一个关于 id 和记录类型的索引,clients_details 有一个关于 client_id 的索引,clients_industry_sectors 也有一个关于 id 的索引。 :)
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 2013-03-21
      • 1970-01-01
      • 2017-04-12
      • 2018-07-03
      • 1970-01-01
      相关资源
      最近更新 更多