如何提高这个 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】:如果不查看所有表和索引,就很难判断。当询问有关加快查询速度的问题时,查询只是方程式的一部分。
clients
在id
上有索引吗?
clients
在record_type
上有索引吗
clients_details
在client_id
上有索引吗?
clients_industry_sectors
在id
上有索引吗?
这些是此查询有机会快速工作所需的最低要求。
【讨论】:
嗨,安迪,是的,客户有一个关于 id 和记录类型的索引,clients_details 有一个关于 client_id 的索引,clients_industry_sectors 也有一个关于 id 的索引。 :)【参考方案4】:非常感谢您的意见和建议。最后,我决定创建一个新的数据库表,该表的唯一目的是为此目的返回结果,因此不需要连接,我只是在向主客户端表添加或删除记录时更新表.从数据存储的角度来看并不理想,但它解决了问题并意味着我可以非常快地获得结果。 :)
【讨论】:
以上是关于如何提高这个 MySQL 查询的性能?的主要内容,如果未能解决你的问题,请参考以下文章