有人可以给我这个优化策略的两分钱

时间:2011-11-28 17:14:12

标签: python mysql

背景:我在python中编写一个匹配的脚本,它将一个数据库中的事务记录与另一个数据库中的客户名称进行匹配。复杂性是名称不是唯一的,并且可以从事务到交易以多种不同的方式表示。

而不是对数据库进行多次查询(这很慢),获取姓氏(在这种情况下我们将说永远不会改变)的所有记录更快是“史密斯”,然后全部那些记录加载到内存中,虽然每个记录使用各种数据点寻找特定“John Smith”的匹配。

这会更快,在python中是否可行,如果有的话,是否有任何建议如何做?

3 个答案:

答案 0 :(得分:2)

关于:“这会更快:”

SQL引擎的幕后物流真的是针对这种事情进行了优化。但是,您可能需要创建SQL PROCEDURE或相当复杂的查询。

警告,如果你不是特别擅长或喜欢维护SQL,并且这不是一个时间敏感的查询,那么你可能会浪费程序员时间来超过CPU / IO时间来实现它。

但是,如果这是经常运行或时间敏感的,你几乎肯定会在SQL中构建某种JOIN逻辑,传入适当的值(可能是通配符),并让数据库进行过滤关系数据集,而不是收集大量的“错误”记录,然后在程序代码中过滤掉它们。

你说数据库“非常慢”。这是因为它是在远程主机上,还是因为表没有为您正在进行的搜索类型编制索引? ...如果您正在对未编入索引的列进行复杂查询,那可能会很痛苦;您可以使用各种SQL工具(包括ANALYZE)来查看可能会降低查询速度的内容。大多数SQL GUI都会有一些这方面的快捷方式。

答案 1 :(得分:1)

问题不在于效率,而在于正确性。无论您是对数据库还是单个大型查询执行多个小查询,如果名称既不唯一也不一致,您打算用它们做什么?

Transaction 1: name="John Smith"
Transaction 2: name="John T. Smith"
Transaction 3: name="John Smith, Jr."
Transaction 4: name="Johnny Smith"

这些交易背后可能有1到4个不同的人,并且没有其他识别信息(例如信用卡号,电子邮件地址,送货地址),一旦找到所有信息,您的程序将会做什么?史密斯“?

回答这个问题,“这取决于”。有人可能会认为单个大型查询会更快,但如果它返回99%的箔条(Bob Smiths,Terry Smiths等),单独查询每个名称可能会快得多。如果您确实有信用卡号等补充信息,这些信息既“更独特”又有索引,那么查询该信息可能是更好的策略,而不是名称。

答案 2 :(得分:0)

虽然我首先考虑使用LIKE和其他SQL函数在数据库查询中尽可能多地完成工作,但您的策略是合理的。应该可以进行符合复杂标准的查询。