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