下面是mysql查询导致服务器上的巨大负载

下面是mysql查询导致服务器上的巨大负载,mysql,sql,Mysql,Sql,嗨,我执行了下面的查询 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; +----+-------------+-------+--------+---------------+-------+---------+----

嗨,我执行了下面的查询

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查询

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);

想想你想要选择什么。到目前为止,您说:给我表1的所有记录,以及表2的所有不匹配记录(即id不匹配的地方)。这很可能会给你带来数亿行。

我将阐述我认为你的意思,如果我不正确,你需要在你的问题中更好地澄清

听起来您正在寻找的是,基于“X”的公共列,对于TableA中尚未存在于TableB中的每个记录。例如,您在表B中有一个主电子邮件地址列表,并试图通过表a导入新记录,但表a中可能有一些记录已经存在于表B中,并且您不关心基于“公用电子邮件地址”列的记录。这只是一个示例说明,但可能更能代表您的要求

如果是这种情况,那么您的“B”表在电子邮件上有索引,查询将使用左连接完成

select 
      a.*
   from
      TableA a
         LEFT JOIN TableB b
            on a.email = b.email
   where
      b.email is null
通过左连接,您告诉引擎尝试匹配公共“电子邮件”地址列。如果是这样,很好,将表之间的记录连接在一起


现在是WHERE子句。因为您想要那些不在表b中的,where子句表示where b.email为NULL。这基本上是陈述。在可能的联接之后,只给我其他表中不匹配的记录。

以下查询将有重复项,因为您可以有a.x>b.x和a.xb.x的x。不确定我是否回答了您关于服务器挂起的问题。也许这两个表有大量的数据?你需要提供更多关于表结构的信息我已经修改了我的问题。。。请检查一下…请让我知道我问题中的上述查询是否会使用索引。目前我在表1上没有索引…a.email也没有索引=b、 电子邮件查询使用表上的索引到,我会得到与我之前显示的a.email=b.email相同的解释计划吗?我执行的方式使我想要表2中不匹配的记录..任何我可以通过左或右连接得到的方法。。。。我期望0行作为输出,比如说,您的table1有四条x=1、2、3和4的记录。您的表有3条x=1、4和5的记录。这将提供10条结果记录:1-4、1-5、2-1、2-4、2-5、3-1、3-4、3-5、4-1、4-5。你是在成倍增加你的记录。这肯定不是你想要的。那么,你想要什么?表1中所有与表2中没有对应关系的记录可能是?