2017-02-09 28 views
0

我想订购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 [email protected]_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

我认为它的确如此。但你应该尝试检查解释分析。性能问题应该包括'EXPLAIN ANALYZE'和一些关于表格大小,索引,当前时间表现,期望时间等的信息。'Slow'是一个相对术语,我们需要一个真实值来比较。 \t \t [** MySQL **](http://dba.stackexchange.com/questions/15371/how-do-i-get-the-execution-plan-for-a-view) –

+0

请阅读本文DBA堆栈交换问题:http://dba.stackexchange.com/questions/11031/order-by-column-should-have-index-or-not ...答案可能是,可能是 –

+0

你真的应该阅读这个。推广使用'JOIN' sintaxis,Aaron Bertrand写了一篇不错的文章[踢坏坏习惯:使用旧式JOINs](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad关于它的-habits-to-kick-using-old-style-joins.aspx)。 –

回答

0

[email protected]_id COLLATE utf8_unicode_ci是低效的,因为它需要在飞行中改变排序规则。更改它SERVICE_ID宣布COLLATE tf8_unicode_ci您的连接正在使用该排序规则。然后......

INDEX(SERVICE_ID, SITE_ID) 

很可能是最好的 -

  1. SERVICE_ID过滤;
  2. 避免排序SITE_ID

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

只是普通的INDEX(SITE_ID)可能不如这个查询。