2015-05-19 25 views
0

我碰到了一些情況,我的新手級別的SQL經驗已經達到了匹配。查詢調優 - 使用likes的多個加入條件

我有一個查詢

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爲22萬行
  • like子句是這樣的 '測試%',所以應該利用我的索引我不認爲我需要一個全文索引,因爲它的尾隨而不是前面的。
  • 我有一個存在的索引,當我使用直等於而不是類似的時候非常有效。

當我查看查詢計劃時,發現我正在瀏覽table2中的每一行(我很驚訝)。內部聯接如何根據首先執行的內容工作?它是否將三列結合爲一體?或者加入第一欄,然後是第二欄,然後是第三欄。

有沒有更好的方法來寫這個查詢?

+2

你可以發佈1)SHOW CREATE TABLE

輸出(或等效於你的RDBMS)的每個表,以及2)'EXPLAIN'輸出(或等效的執行計劃)? –

+3

對於性能問題,您應該始終包含您正在使用的數據庫。 –

回答

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)。雖然這兩個子查詢應該使用索引,但您可能會得到大量匹配,以減緩查詢的中間結果。

+0

根據所使用的RDBMS以及它如何維護和應用索引統計信息,您可能需要(一,九)和/或b(二,四)。 –