如何提高这个 MySQL 查询的性能?

Posted

技术标签:

【中文标题】如何提高这个 MySQL 查询的性能?【英文标题】:How can I improve the performance of this MySQL query? 【发布时间】: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:索引都是独立的。 :) 【参考方案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】:

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

【讨论】:

以上是关于如何提高这个 MySQL 查询的性能?的主要内容,如果未能解决你的问题,请参考以下文章

如何提高 Django 管理员搜索相关字段(MySQL)中的查询性能

如何提高MYSQL查询的性能?

如何提高选择查询的性能

如何提高查询性能?

如何强制连接顺序以提高 MYSQL 中的查询性能?

MYSQL 在使用 OR 时提高查询性能