[英]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.street
和b.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.