Mysql 更高效的sql查找不在联接表中的记录?

Mysql 更高效的sql查找不在联接表中的记录?,mysql,sql,Mysql,Sql,我有: 我想拉出在join_smsuser_活动表中没有记录的sms_用户(通过join_smsuser_活动.sms_用户id=sms_用户id关系) 我有sql: _sms_users_ id _join_smsuser_campaigns_ sms_user_id 编辑: 以下是解释选择结果: select * from sms_users where id not in (select sms_user_id from join_smsuser_campaigns); 看起来问题是

我有:

我想拉出在join_smsuser_活动表中没有记录的sms_用户(通过join_smsuser_活动.sms_用户id=sms_用户id关系)

我有sql:

_sms_users_
id

_join_smsuser_campaigns_
sms_user_id
编辑:

以下是解释选择结果:

select * from sms_users where id not in (select sms_user_id from join_smsuser_campaigns);
看起来问题是我在加入时没有sms\u用户\u id的索引


运行大约需要5分钟,我看到有一条记录。有没有更有效的方法通过连接来实现这一点?我的sql技能非常基础。

in
子句中有许多项时,查询可能会变慢。改用
左连接

mysql> explain select u.* from sms_users u left join join_smsuser_campaigns c on u.id = c.sms_user_id  where c.sms_user_id is null;
+----+-------------+-------+-------+---------------+-------------------------------------------------------------+---------+------+-------+--------------------------------------+
| id | select_type | table | type  | possible_keys | key                                                         | key_len | ref  | rows  | Extra                                |
+----+-------------+-------+-------+---------------+-------------------------------------------------------------+---------+------+-------+--------------------------------------+
|  1 | SIMPLE      | u     | ALL   | NULL          | NULL                                                        | NULL    | NULL | 42303 |                                      |
|  1 | SIMPLE      | c     | index | NULL          | index_join_smsuser_campaigns_on_campaign_id_and_sms_user_id | 8       | NULL | 30722 | Using where; Using index; Not exists |
+----+-------------+-------+-------+---------------+-------------------------------------------------------------+---------+------+-------+--------------------------------------+

mysql> describe sms_users;
+------------------------+------------+------+-----+---------+-------+
| Field                  | Type       | Null | Key | Default | Extra |
+------------------------+------------+------+-----+---------+-------+
| id                     | int(11)    | NO   | PRI | NULL    |       |

mysql> describe join_smsuser_campaigns;
+---------------------+------------------+------+-----+---------+-------+
| Field               | Type             | Null | Key | Default | Extra |
+---------------------+------------------+------+-----+---------+-------+
| sms_user_id         | int(11)          | NO   |     | NULL    |       |

请参见

假设您在
加入smsuser\u活动(sms\u用户id)
上有索引,则您的查询应该是正常的。添加索引后,两个查询(原始查询和新查询)只需几秒钟。谢谢,谢谢。现在运行查询以查看是否更快。你发送的链接很好,应该只需要几毫秒。运行
explain select…
查看查询没有使用indexesok的地方,我在上面添加了一个带有这些结果和表描述的编辑。我想我缺少一个索引。是的,尝试添加一个键到
sms\U用户id
ALTER TABLE join\U smsuser\U活动添加索引idx\U sms\U用户id(sms\U用户id)
请参见上文-是的,主要问题是缺少索引,但我确实更改了查询以使用左连接。
select u.*
from sms_users u
left join join_smsuser_campaigns c on u.id = c.sms_user_id 
where c.sms_user_id is null