我想在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
认为它不会因为订单发生在中间联接结果集...
答案 0 :(得分:0)
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)
可能不太好。