查询调优 - 使用喜欢

时间:2015-05-19 20:30:48

标签: sql

我遇到了一些情况,我的初级SQL经验已经达到了它的匹配。

我有一个查询

SELECT a.One, 
    a.Two, 
    a.Three, 
    a.Four, 
    b.One, 
    b.Two
FROM table1 a
INNER JOIN table2 b on b.Four = a.Nine
        and b.Six like a.One
        and b.Seven like b.Two
  • 表1是25000行
  • 表2是2200万行
  • like子句就像这个'test%'一样,所以它应该利用我拥有的索引,我认为我不需要全文索引,因为它的尾随而不是前面的。
  • 当我使用直线等于而不是类似的时候,我有一个存在且效率非常高的索引。

当我查看查询计划时,我看到我正在浏览table2中的每一行(我感到很惊讶)。内部联接如何根据首先执行的内容工作?它是否将三列组合为连接?或者它与第一列连接,然后是第二列,然后是第三列。

有没有更好的方法来编写此查询?

1 个答案:

答案 0 :(得分:2)

问题是索引只能用于一次like 'pattern%'比较。这是不等式,因此索引使用在第一个停止。

通过将查询更改为union

,您可能会有运气
SELECT a.One, a.Two, a.Three, a.Four, b.One, b.Two
FROM table1 a INNER JOIN
     table2 b
     ON b.Four = a.Nine and b.Six like a.One
UNION
SELECT a.One, a.Two, a.Three, a.Four, b.One, b.Two
FROM table1 a INNER JOIN
     table2 b
     ON b.Four = a.Nine and bb.Seven like b.Two;

然后,在a(Nine, One)b(Four, Two)上设置索引。虽然这两个子查询应该使用索引,但是可能会为中间结果获得大量匹配,从而减慢查询速度。