2017-09-27 206 views
0
SELECT 
    XYZ_ID 
FROM XYZ 
WHERE 
    SUBSTR(Processor_Key, 24, 5) = '01000' AND 
    SUBSTR(Processor_Key, 32, 5) = '00900' AND 
    SUBSTR(Processor_Key, 40, 5) = '00070' AND 
    SUBSTR(Processor_Key, 48, 5) = '10000' AND 
    SUBSTR(Processor_Key, 56, 5) = '66000' AND 
    SUBSTR(Processor_Key, 64, 5) = '09000' AND 
    SUBSTR(Processor_Key, 72, 5) = '00050'; 

如何優化查詢並降低查詢成本?如何使用SUBSTR優化查詢

+4

擺脫substr。以不需要的方式存儲數據。或者處理應用程序代碼中的數據處理。否則,你幾乎卡住了。 – Strawberry

+0

數據來自用戶,它可以是任何東西..應用程序數據處理不可能,我只在這裏添加了虛擬數據。 – user8413514

回答

3

被downvoted高風險,但有一點可能的工作將是與單個LIKE表達式替換你的許多SUBSTR電話:

SELECT XYZ_ID 
FROM XYZ 
WHERE 
    Processor_Key LIKE '_______________________01000___00900___00070___10000___66000___09000___00050%'; 

這可能跑贏大原因,你的原始查詢的是,LIKE表達可以通過在處理器密鑰的前77個字符中最多進行一次單獨通過來進行評估。在您的原始查詢中,您會對SUBSTR進行七個不同的調用,每個調用都需要進行評估才能做出決定。

這就是說,正如@戈登和上述評論指出的那樣,最好的長期解決方案可能是將您的密鑰分解爲單獨的列併爲每一列編制索引。這可以讓您充分利用數據庫的全部功能,例如通過索引。

1

你不行。 SQL引擎不能爲此查詢使用傳統索引。

你有什麼選擇?根據字符串的外觀,您可能可以使用全文搜索。

或者,您可能希望將代碼拖到單獨的列中 - 然後在這些列上構建索引。據推測,代碼實際上意味着什麼。您可以在插入時明確地執行此操作,也可以使用觸發器來填充列。

另一種選擇是在最新版本的MySQL中可用,您可以爲每個子字符串創建一個生成的列,然後爲它們創建一個索引。