MYSQ中not in 语句如何优化。

lmss82 2009-06-26 12:22:58
在mysql中这样的语句该如何优化。

select * from table where uid no in(1,2,3,4,5,6,7,8)

有什么好的方法。
...全文
7922 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuhongwei90 2011-12-12
  • 打赏
  • 举报
回复
select *
from ipcstorage.cachetmp a
left join (select lblid from ipcconfigdb.labelfilter where ftype=2 )b on
a.lblid = b.lblid
where b.lblid is null
搞定优化,来分享一下
liuhongwei90 2011-12-12
  • 打赏
  • 举报
回复
怎么用left join 写呢 注意是mysql 没测试别瞎说
qizhicong2 2009-06-28
  • 打赏
  • 举报
回复
改为LEFT JOIN吧
懒得去死 2009-06-27
  • 打赏
  • 举报
回复
改为LEFT JOIN吧。
ACMAIN_CHM 2009-06-26
  • 打赏
  • 举报
回复

uid 加上索引就行了。如果就这么几个数,没什么可优化的。

ACMAIN_CHM 2009-06-26
  • 打赏
  • 举报
回复

UID 上有索引吗?
lmss82 2009-06-26
  • 打赏
  • 举报
回复
数据比较多时,扫表比较严重.
netxuning 2009-06-26
  • 打赏
  • 举报
回复

mysql> explain select * from test where uid not in(1014565,4197701,1896493,1086589,1004369,1071314,2969603,1017104,1003889);
+----+-------------+--------------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------+------+---------------+------+---------+------+-------+-------------+
| 1 | SIMPLE | test | ALL | PRIMARY | NULL | NULL | NULL | 66723 | Using where |
+----+-------------+--------------+------+---------------+------+---------+------+-------+-------------+


如果在需求上,只需列出 uid的话,可以将语句改为:
select uid from test where uid not in(1014565,4197701,1896493,1086589,1004369,1071314,2969603,1017104,1003889);
如此mysql会利用上索引去找!

如果不是单单列出uid,加上force index试试看!
wangchunning 2009-06-26
  • 打赏
  • 举报
回复
创建索引肯定不会错的,但not in是否能用上索引就要看数据流了
ACMAIN_CHM 2009-06-26
  • 打赏
  • 举报
回复

不好意思,没看清楚,你用的是 NOT IN ,这样的话,一般来说MySQL会使用全表扫描而不是去利用索引。原因也很简单。因为MYSQL认为用索引反而更麻烦。

比如让你从 1000 个人中间把编号为 145, 761 这两个学生之外的所有学生资料抄写一遍。你是先找出这两个学生的成绩放一边儿,然后再开始抄写,还是直接开始一份挨一份开始抄写,看到 这两个号直接跳过去?
lmss82 2009-06-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ACMAIN_CHM 的回复:]
有索引的情况下不应该是全表扫描啊。见如下的测试例子。或者你可以贴出你的EXPLAIN的结果大家一起分析一下。

SQL codemysql>explainselect*fromt1whereidin(1,2,3,4,5,6,7,8,9);+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+|id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra|+----+-------------+-------+-------+---------------+---------+…
[/Quote]

mysql> explain select * from test where uid not in(1014565,4197701,1896493,1086589,1004369,1071314,2969603,1017104,1003889);
+----+-------------+--------------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------+------+---------------+------+---------+------+-------+-------------+
| 1 | SIMPLE | test | ALL | PRIMARY | NULL | NULL | NULL | 66723 | Using where |
+----+-------------+--------------+------+---------------+------+---------+------+-------+-------------+
lmss82 2009-06-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 vinsonshen 的回复:]
在uid列上建立索引
如果in后面的数据是范围性的,则用范围查询(>、 <)代替;
如果in后面的值是列表形式的,且数据量很大,可以购造一表存放再联接查询。
[/Quote]
是列表形式的,数据会有几百个。
是类似这样做吗?SELECT * FROM TABLE WHERE UID NOT IN (SELECT UID FROM TABLE2 WHERE UID=N)

购造一表存放再联接查询是什么样的形式 ?
ACMAIN_CHM 2009-06-26
  • 打赏
  • 举报
回复

有索引的情况下不应该是全表扫描啊。见如下的测试例子。或者你可以贴出你的EXPLAIN的结果大家一起分析一下。

mysql> explain select * from t1 where id in (1,2,3,4,5,6,7,8,9);
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref |rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| 1 | SIMPLE | t1 | range | PRIMARY | PRIMARY | 4 | NULL | 9 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
1 row in set (0.00 sec)

mysql>
lmss82 2009-06-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ACMAIN_CHM 的回复:]
UID 上有索引吗?
[/Quote]有索引。
vinsonshen 2009-06-26
  • 打赏
  • 举报
回复
在uid列上建立索引
如果in后面的数据是范围性的,则用范围查询(>、<)代替;
如果in后面的值是列表形式的,且数据量很大,可以购造一表存放再联接查询。
fcoolx 2009-06-26
  • 打赏
  • 举报
回复
uid 加索引
把not in 改写成 >,<等

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧