对连接的结果进行排序时,索引是不是会提高性能
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)
可能不适合这个 查询。
【讨论】:
以上是关于对连接的结果进行排序时,索引是不是会提高性能的主要内容,如果未能解决你的问题,请参考以下文章