2

我有一个 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 多秒才能完成。由于不需要文件排序,因此删除“ORDER BY”会将其减少到大约 30 毫秒。有什么办法可以更改此查询以改善 5 秒以上的响应时间?

4

4 回答 4

2

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

尤其:

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

于 2010-10-15T15:39:09.017 回答
0

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

于 2010-10-15T15:28:06.623 回答
0

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

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

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

于 2010-10-15T15:28:56.803 回答
0

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

于 2010-10-19T10:33:07.207 回答