2015-10-22 31 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)也许它可以通过使用功能指数

相关问题