对连接的结果进行排序时,索引是不是会提高性能

Posted

技术标签:

【中文标题】对连接的结果进行排序时,索引是不是会提高性能【英文标题】:does index improve performance when sorting results of a join对连接的结果进行排序时,索引是否会提高性能 【发布时间】:2017-02-09 13:54:22 【问题描述】:

我想对 4 个表之间的连接结果进行排序 - 为按列排序 (b.SITE_ID) 创建索引会提高查询性能吗?

SELECT b.SERVICE_ID, b.ATT_ID, b.SITE_ID, b.ATT_VALUE, c.KEY_NAME, d.NAME as account_name
FROM SITE_ATTRIBUTES a , SF_SITE_ATTRIBUTES b, ATTRIBUTE_DEF c,SF_SITE_MASTER d 
WHERE  a.SERVICE_ID=b.SERVICE_ID 
  and  b.SERVICE_ID=c.SERVICE_ID  
  and  b.SERVICE_ID=d.SERVICE_ID 
  and  b.SERVICE_ID=@service_id COLLATE utf8_unicode_ci 
  and b.ATT_ID= c.ID  
  and b.ATT_ID= a.ATT_DEF 
  and a.SITE=b.SITE_id  
  and b.SITE_ID = d.ID 
  and a.value != b.att_value 
  and b.att_value is not null 
ORDER BY b.SITE_ID

认为它不会因为订单发生在中间连接结果集上......

【问题讨论】:

我认为确实如此。但是您应该尝试检查解释分析。性能问题应该包括EXPLAIN ANALYZE和一些关于表大小、索引、当前时间性能、期望时间等的信息。Slow是一个相对术语,我们需要一个真实的值来比较。 mysql 请阅读这个 DBA Stack Exchange 问题:dba.stackexchange.com/questions/11031/… ... 答案可能是,可能是的 你真的应该阅读这个。提倡使用显式JOIN sintaxis,Aaron Bertrand 写了一篇很好的文章Bad habits to kick : using old-style JOINs 关于它。 有关背景信息,请参阅此dba answer 中的链接。另外,Understanding the Query Execution Plan。但是仅创建索引并衡量差异是否那么很难? 请使用JOIN...ON语法重写。 【参考方案1】:

b.SERVICE_ID=@service_id COLLATE utf8_unicode_ci 效率低下,因为它需要动态更改排序规则。将其更改为 SERVICE_ID 声明为 COLLATE tf8_unicode_ci 并且您的连接正在使用该排序规则。那么……

INDEX(SERVICE_ID, SITE_ID)

可能是最好的——

    过滤SERVICE_ID; 避免使用SITE_ID 进行排序。

过滤的其余部分(!=NOT NULL)通过索引是不可避免的。

简单的INDEX(SITE_ID) 可能不适合这个 查询。

【讨论】:

以上是关于对连接的结果进行排序时,索引是不是会提高性能的主要内容,如果未能解决你的问题,请参考以下文章

mysql索引知识点汇总

数据库索引(转)

视图的索引字段是不是会提高 MySQL 的性能?

索引视图以提高 SQL Server 上多个连接的性能

索引的作用及优缺点

Mysql索引基础