这是对我之前的问题链接的一种跟进。
一段时间过去了,所以我不确定是否需要更新那个或创建一个新的,特别是因为我的问题的参数发生了一些变化。
--
我有一个大的(简单的)电话号码表(> 500 万并且还在增长)。该表设置如下:
| AreaCode | Local | Created |
- “本地”是 3 位区号后面的 7 位数字
- “创建”只是一个时间戳
- AreaCode 和 Local 都被索引
- 我曾经有一个 ID 列作为我的主键,但在我对表进行分区时将其删除。我在 AreaCode 上按范围设置了 10 个分区(<100、<200、<300、~<999)
我正在上传数字的 csv 文件(最多 250k 行),通过 PHP 清理和清理输入,然后创建一个临时表并将数据插入其中。
在这之后,我遇到了很多麻烦。对于较小的数据大小(10k-25k 行),我真的没有任何问题。但是,当我尝试将包含 250k+ 行的临时表与我的主数据库进行比较时,需要的时间非常长。
我已经尝试了以下 2 个查询,但其中任何一个都不太走运。
使用内连接
SELECT a.* FROM master_table a
INNER JOIN temp_table b
ON a.AreaCode = b.AreaCode
AND a.Local = b.Local;
我在一个网站上找到了这个建议并尝试了它
SELECT b.* FROM temp_table b
WHERE b.AreaCode
IN (
SELECT a.AreaCode
FROM master_table a
WHERE a.AreaCode = b.AreaCode
AND a.Local = b.Local
);
我为长长的问题道歉,但我对 mysql 的掌握很弱。
- 我是否因为没有主键和/或唯一键而犯了错误?由于每个电话号码都是唯一的,我不确定拥有 ID 列是否对我有利。
- 我对我的主表进行分区是正确的还是这让我放慢了速度?
- 我的 AreaCode 和 Local 列上有索引。当我创建临时表时,我是否也应该在相同的列上创建索引?
- 请帮我解决我的查询,这样就不会花这么长时间了!!