我需要开发一个查询来查找数据库中的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-001
或CK10000579-020-3
。
任何帮助都将受到赞赏:)
。
答案 0 :(得分:1)
您必须找到避免表扫描的方法。
几个选项:
1)在“pack”列上创建一个索引,并在查询之前将“ - ”放入搜索字符串中。仅当您知道在搜索字符串中放置“ - ”的位置时才会起作用(例如,当它们始终位于相同位置时)。这是最简单的方法。
2)创建一个额外的列“pack_search”。用replace(pack,“ - ”,“”)填充它。创建INSERT或UPDATE触发器以在更新或插入行时更新其值。在该列上创建索引并将该列用于查询。
3)更好:在表上创建一个View,其中包含修改后的pack列和该视图上的Index(dunno,如果它适用于mysql,postgres肯定可以这样做)。在查询中使用该视图。为了进一步加速,如果表读取的次数比写入的要多得多,或者查询结果的延迟是否正常(例如,如果表每晚更新并且您查询在线服务),则可以实现该视图。
4)也许可以通过使用功能索引
来完成