我得到了一个带有2个表的Mysql Innodb。一个是超过117万行,有超过340列,包括姓名,地址,城市,州和邮政编码。第二个表是1700多万行,包括姓名,地址,城市,州和邮编以及电子邮件。第1和第2表中的数据不会被添加或更新。每个表中的id都有一个主键。没有定义其他索引。
我首先在11700万行表中创建了一个联系人表,其中只有名称,地址,城市,州和邮政编码,使其显着缩小。我编写了一个php脚本,使用1700多万条记录中较小的表中的每一行执行搜索,尝试在联系人表中查找匹配项。找到一个后,我将id和电子邮件插入一个单独的表中。我取消了它,因为每次搜索大约需要86秒。拥有超过1700万条记录需要永远完成。
这是我的搜索查询:
q= "SELECT id FROM GB_contacts WHERE LAST_NAME=\"$LAST\" and FIRST_NAME=\"$FIRST\" and MI=\"$MIDDLE\" and ADDRESS=\"$ADDRESS\" and ZIP=\"$ZIP\"".
我的问题是如何更快地完成这项工作?我应该在联系人表格中的名称,地址和邮政编码索引,还是应该索引联系人表格中的每一列?有没有更快的方法通过mysql这样做?我已经阅读了大量不同的资源,并且不确定哪种方式最好。由于这些是如此庞大的表格,我尝试做的任何事情都需要很长时间,因此我希望得到一些专家建议,避免浪费时间,数周和数月来试图解决这个问题。感谢您提供任何有用的建议!
答案 0 :(得分:1)
执行此操作的最佳方法是在要匹配的字段上创建聚簇索引。在这种情况下,最好先从邮政编码开始,然后先输入名字或姓氏 - 姓氏较长,所以需要更长时间才能匹配,但也更加明显,因此会留下更少的行进一步匹配(你必须测试哪个表现更好)。这里的策略是告诉mysql只是在人们的口袋中,而不是搜索整个数据库。在这样做时,你必须聪明地告诉MySQL开始缩小范围。在测试时,不要忘记使用EXPLAIN命令。
答案 1 :(得分:0)
您是否尝试过典型的加入,如果您的加入密钥已编入索引,则不应花费太多时间。
如果有一次你可以在连接列上创建索引。
第二步是将返回的记录加载到新的联系人表中。