Mysql搜索了118万行,耗时86秒

时间:2012-07-06 05:32:43

标签: mysql indexing

我得到了一个带有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这样做?我已经阅读了大量不同的资源,并且不确定哪种方式最好。由于这些是如此庞大的表格,我尝试做的任何事情都需要很长时间,因此我希望得到一些专家建议,避免浪费时间,数周和数月来试图解决这个问题。感谢您提供任何有用的建议!

2 个答案:

答案 0 :(得分:1)

执行此操作的最佳方法是在要匹配的字段上创建聚簇索引。在这种情况下,最好先从邮政编码开始,然后先输入名字或姓氏 - 姓氏较长,所以需要更长时间才能匹配,但也更加明显,因此会留下更少的行进一步匹配(你必须测试哪个表现更好)。这里的策略是告诉mysql只是在人们的口袋中,而不是搜索整个数据库。在这样做时,你必须聪明地告诉MySQL开始缩小范围。在测试时,不要忘记使用EXPLAIN命令。

答案 1 :(得分:0)

您是否尝试过典型的加入,如果您的加入密钥已编入索引,则不应花费太多时间。

如果有一次你可以在连接列上创建索引。

第二步是将返回的记录加载到新的联系人表中。