在对连接的结果进行排序时,索引会改进性能吗?

时间:2017-02-09 13:54:22

标签: mysql database sql-order-by query-performance

我想在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

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

1 个答案:

答案 0 :(得分:0)

b.SERVICE_ID=@service_id COLLATE utf8_unicode_ci效率低下,因为它需要动态更改排序规则。更改它以便SERVICE_ID声明COLLATE tf8_unicode_ci 您的连接正在使用该排序规则。然后...

INDEX(SERVICE_ID, SITE_ID)

可能是最好的 -

  1. 过滤SERVICE_ID;
  2. 避免通过SITE_ID进行排序。
  3. 过滤的其余部分(!=NOT NULL)通过索引无法避免。

    对于查询,简单INDEX(SITE_ID)可能不太好。