查找与200,000条记录的表中的另一个值匹配的varchar值

时间:2013-12-10 22:57:35

标签: mysql

我有一个名为USERS的表,它有几个字段,包括一个名为'varchar'(6)类型的'postal'。

然后我有另一个名为POSTALS的表只有一列:'varchar'类型的'postal'(6)。 这个POSTALS表有大约200,000条记录。

我需要从USERS表中获取所有记录,其中该表中的“邮政”与POSTALS表中的“邮政”匹配。

我尝试了明显的基本查询:

SELECT users.user_id, users.user_fname, user_lname 
                FROM users, postals 
                WHERE replace(user_postal , ' ','') = postals.postal 

但是这个查询永远不会完成。它总是超时。我可以看到这将是一个资源非常密集的查询,因为它将'用户'(有大约250,000行)的每个值与'邮政'(几乎有200,000行)的每个值进行比较。

还有其他更简化的方法来进行这种比较吗? 感谢。

3 个答案:

答案 0 :(得分:0)

试试这个:

SELECT u.user_id, u.user_fname, u.user_lname 
FROM users u WHERE EXISTS (SELECT DISTINCT postal FROM postals WHERE postal = u.postal)

答案 1 :(得分:0)

鉴于两者都是varchar(6),为什么要替换空格?

SELECT u.user_id, u.user_fname, u.user_lname 
FROM users u join
     postals p
     on u.user_post = p.postal;

要使此运行更快,请在postals表上创建索引:

create index postals_postal on postals(postal);

答案 2 :(得分:0)

从您的问题中调用replace的原因并不明显。你需要剥离所有空间吗?这个函数调用每次比较(以及潜在的索引缺失)将会杀死你的查询。

首先要检查两个表中的postal字段是否有索引。