有没有办法优化MYSQL REPLACE功能?

时间:2015-10-22 10:30:36

标签: python mysql replace sqlalchemy

我需要开发一个查询来查找数据库中的MF001317-077944-01,但提供的字符串(我必须用来搜索)没有-

所以我目前正在使用:

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

任何帮助都将受到赞赏:)

1 个答案:

答案 0 :(得分:1)

您必须找到避免表扫描的方法。

几个选项:

1)在“pack”列上创建一个索引,并在查询之前将“ - ”放入搜索字符串中。仅当您知道在搜索字符串中放置“ - ”的位置时才会起作用(例如,当它们始终位于相同位置时)。这是最简单的方法。

2)创建一个额外的列“pack_search”。用replace(pack,“ - ”,“”)填充它。创建INSERT或UPDATE触发器以在更新或插入行时更新其值。在该列上创建索引并将该列用于查询。

3)更好:在表上创建一个View,其中包含修改后的pack列和该视图上的Index(dunno,如果它适用于mysql,postgres肯定可以这样做)。在查询中使用该视图。为了进一步加速,如果表读取的次数比写入的要多得多,或者查询结果的延迟是否正常(例如,如果表每晚更新并且您查询在线服务),则可以实现该视图。

4)也许可以通过使用功能索引

来完成