0

我得到了一个带有 2 个表的 Mysql Innodb。一个是 117+ 百万行,有超过 340 列,包括姓名、地址、城市、州和邮政编码。第二个表是 17+ 百万行,其中包含姓名、地址、城市、州和邮政编码以及电子邮件。第一个和第二个表中的数据不会被添加或更新。每个表中的 id 都有一个主键。没有定义其他索引。

我首先从 117+ 百万行表中创建了一个联系人表,其中只有名称、地址、城市、州和邮编,使其显着变小。我编写了一个 php 脚本来使用包含 17+ 百万条记录的较小表中的每一行执行搜索,试图在联系人表中找到匹配项。当找到一个时,我将 id 和 email 插入到一个单独的表中。我取消了它,因为每次搜索大约需要 86 秒。拥有 17+ 百万条记录将需要很长时间才能完成。

这是我的搜索查询:

q= "从 GB_contacts 中选择 id
WHERE LAST_NAME=\"$LAST\" 和 FIRST_NAME=\"$FIRST\" 和 MI=\"$MIDDLE\"
和 ADDRESS=\"$ADDRESS\" 和 ZIP=\"$ZIP\""。

我的问题是我怎样才能更快地做到这一点?我应该对联系人表中的姓名、地址和邮编进行索引,还是应该索引联系人表中的每一列?有没有更快的方法通过mysql做到这一点?我已经阅读了一大堆不同的资源,但不确定哪个是最好的方法。由于这些桌子很大,我尝试做的任何事情都需要很长时间,所以我希望得到一些专家的建议,避免浪费几天、几周和几个月的时间来解决这个问题。感谢您提供任何有用的建议!

4

2 回答 2

1

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

于 2012-07-06T05:42:47.397 回答
0

您是否尝试过典型的连接,如果您的连接键被索引,它应该不会花费太多时间。

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

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

于 2012-07-06T06:12:04.497 回答