下面是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.x