mysql查询会给服务器带来巨大的负载



你好,我已经执行了下面的查询

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连接之后,只给我在另一个表中没有匹配的记录。

相关内容

  • 没有找到相关文章

最新更新