2015-10-22 56 views
0

我需要開發一個查詢來查找數據庫中的MF001317-077944-01,但提供的字符串(我必須使用它來搜索)沒有-有沒有辦法優化MYSQL REPLACE功能?

所以我目前正在使用:

select * from sims where replace(pack, "-", "") = "MF00131707794401"; 

SQLAlchemy的等效:

s.query(Sims).filter(func.replace(Sims.pack, "-", "") == "MF00131707794401").all() 

但花的時間過長。平均1分22秒,我需要的是1秒鐘之內。

我已經考慮過使用通配符,但我不知道這是否是解決我的問題的最佳方法。

有沒有辦法優化replace查詢? 還是有更好的方式來實現我想要的,即操縱python中的字符串以獲得MF001317-077944-01

哦..我還應該提到它可能不總是相同的,例如,兩個不同的包裝數可能是XAN002-026-001CK10000579-020-3

任何幫助將不勝感激:)

+0

可惜沒做,即使'pack'被索引那麼它將無法用它來給定的where子句。 –

+0

@AbhikChakraborty感謝您的回覆,是否有沒有另一種方式來實現這個在MySQL? – Renier

+0

一種方法是在數據庫中創建另一個列,並將所有沒有'-'的字符串存儲起來,在插入前您可以執行這些操作,然後查詢將在該列上進行,並且從索引中獲得更好的保證。 –

回答

1

您必須找到避免表掃描的方法。

幾個選項:

1)創建你的「包」列的索引,把「 - 」進入查詢之前所搜索的字符串。只有當您知道將「 - 」放在搜索字符串中時(例如,當它們始終處於相同位置時)纔會起作用。這是最簡單的方法。

2)創建一個額外的列「pack_search」。用替換填充(pack,「 - 」,「」)。更新或插入行時,創建INSERT或UPDATE觸發器以更新其值。在該列上創建索引並將該列用於查詢。

3)更好:在表格上用修改後的包列和索引在該視圖上創建一個視圖(不知道如果它在mysql上工作,postgres肯定可以做到這一點)。使用該視圖查看您的查詢。爲了進一步提高速度,如果表的讀取多於寫入或查詢結果滯後(例如,如果表每晚更新並且查詢聯機服務),則可以實現該視圖。

4)也許它可以通過使用功能指數

相關問題