你好,我已经执行了下面的查询
select a.* from table1 a, table2 b where a.x!=b.x;
由于服务器挂起,我无法提供两个表的确切结构。
服务器负载过大。表1没有索引,表2在x上有索引
我已经解释了类似查询的输出。
select a.* from table1 a, table2 b where a.x!=b.x;
+----+-------------+-------+--------+---------------+-------+---------+----------------+-------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+-------+---------+----------------+-------+-------+
| 1 | SIMPLE | b | ALL | NULL | NULL | NULL | NULL | 70503 | |
| 1 | SIMPLE | a | eq_ref | email | email | 386 | ASP_DB.b.email | 1 | |
+----+-------------+-------+--------+---------------+-------+---------+----------------+-------+-------+
2 rows in set (0.00 sec)
有谁能帮我一下吗?
表1有69264行,表2有3332349行,这是mysql查询
想想你要选择什么。到目前为止,您说:给我表1的所有记录和表2的所有不匹配的记录(即id不匹配的地方)。这可能会为您提供数亿行。
select a.* from table1 a
LEFT JOIN table2 b
ON a.x=b.x
WHERE b.x IS NULL
b.x的索引会有帮助。
ALTER TABLE table1 ADD INDEX (x);
我将扩展我认为你的意思,如果我错了,你需要更好地澄清你的问题。
这听起来像你正在寻找的是,每一个记录在TableA中,还不存在于TableB基于"X"的公共列。例如,您在表B中有一个主电子邮件地址列表,并试图通过表a导入新记录,但是表a中的一些记录可能已经存在于B中,并且您不关心那些基于公共电子邮件地址列的记录。这只是一个示例解释,但可能更能说明你的要求。
如果是这种情况,那么你的"B"表有电子邮件的索引,查询将使用LEFT-JOIN。
select
a.*
from
TableA a
LEFT JOIN TableB b
on a.email = b.email
where
b.email is null
通过LEFT-JOIN,您告诉引擎尝试在公共"email"地址列上进行匹配。如果是,很好,将表之间的记录连接在一起。
现在,WHERE子句。因为你想要那些不在表b中,where子句说b.e rmail是NULL。这基本上是陈述。在POSSIBLE连接之后,只给我在另一个表中没有匹配的记录。