如何改进具有内部联接的MySQL查询

时间:2014-09-29 11:07:30

标签: mysql performance

我正在使用MySQL数据库,并且由于第三方客户端,我们有一些需要很长时间的查询。 '问题'是有一个使用一些内部连接的外部选择,而没有使用'where'过滤结果,而'where'仅在“外部”部分,这导致连接2个非常大的表而不是加入表的两个小得多的子集(我无法控制它,这是他们完成的方式......我必须定义它们的连接,他们只是使用这个结构添加where子句)。请注意,如果'where'子句在内部连接中,则连接会小得多,整个查询会更快。

我考虑过使用视图实现内部联接,但它会产生相同的性能。连接比较的所有字段都被编入索引。

我被告知可以通过一些数据库的配置调整来改进它,但没有人能说出究竟是什么。

以下是查询的解释(需要花费大量时间来执行):

SELECT a.*,
       SUM(b.p1) p1
FROM
  (SELECT a.*,
          b.p1
   FROM a
   LEFT OUTER JOIN b ON a.some_value = b.some_value)
WHERE a.some_value = 'x'

只是为了解释一下,如果我可以自己编写查询,我会像这样编写它(需要大约200ms来执行):

SELECT a.*,
       SUM(b.p1) p1
FROM a
LEFT OUTER JOIN b ON a.some_value = b.some_value
WHERE a.some_value = 'x'

任何想法我该如何改进?

1 个答案:

答案 0 :(得分:0)

您的个人重写是可以的,但是,将where b.y添加到where子句会将您的LEFT联接杀死为INNER JOIN。 AND b.y应该是join的ON子句的一部分,以保留left-join资格。

对于索引,表A应该在(x,b_id)上有索引,而表B在(id,y,p1)上有覆盖索引