簡體   English   中英

使用LEFT()函數的查詢性能不佳

[英]Query using LEFT() function has bad performance

我正在使用帶有左功能的INNER JOIN和WHERE來按其前8個字符匹配記錄。

INSERT INTO result SELECT id FROM tableA a
INNER JOIN tableB b ON a.zip=b.zip
WHERE LEFT(a.street,8)=LEFT(b.street,8)

a.streetb.street被索引(部分索引8)。

查詢未在24小時以上完成。 我想知道索引是否存在問題,或者是否有更有效的方法來執行此任務

Mysql不會對應用了功能的列使用索引。

其他數據庫確實允許基於函數的索引。

您可以創建一個僅包含a.street和b.street的前8個字符的列,並對它們進行索引,這樣會更快。

這是您的查詢:

INSERT INTO result
    SELECT id
    FROM tableA a INNER JOIN
         tableB b ON a.zip=b.zip
    WHERE LEFT(a.street,8)=LEFT(b.street,8);

MySQL不夠聰明,無法在此比較中使用前綴索引。 它將使用前綴索引進行like和直接的字符串比較。 如果我假設id是來自tableA ,則以下代碼可能會更好:

INSERT INTO result(id)
    SELECT id
    FROM tableA a
    WHERE exists (select 1
                  from tableB b
                  where a.zip = b.zip and
                        b.street like concat(left(a.street, 8), '%')
                 );

您想要的索引是tableB(zip, street(8))tableB(zip, street) 這可能會使用索引的兩個部分。 無論如何,即使它不能同時使用索引的兩端,它也可能會獲得更好的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM