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)

有什么好的方法。
...全文
7980 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 改写成 >,<等
内容概要:本文围绕高比例可再生能源并网背景下虚拟电厂的多时间尺度调度问题展开研究,重点解决系统灵活性与储能成本之间的平衡挑战。通过构建日前调度与日内调度的双层优化模型,整合风电、光伏等不确定性出力与多用户负荷的灵活性资源,同时引入储能系统容量衰减模型,提升调度方案的经济性与可持续性。研究采用Matlab进行仿真验证,实现了对储能充放电行为的精细化管理,并结合先进优化算法求解非线性约束下的复杂调度问题,有效降低了系统运行成本,增强了电网对可再生能源的消纳能力。; 适合人群:具备电力系统、可再生能源或优化调度基础知识的研究生、科研人员及工程技术人员,熟悉Matlab编程与数学建模者更佳; 使用场景及目标:①用于高比【顶级SCI复现】高比例可再生能源并网如何平衡灵活性与储能成本?虚拟电厂多时间尺度调度及衰减建模(Matlab代码实现)例新能源接入场景下的虚拟电厂能量管理系统设计;②支撑含储能系统的多时间尺度调度策略研究,提升调度精度与设备寿命;③为SCI论文复现与科研课题提供可扩展的技术框架与代码基础; 阅读建议:建议结合文提到的Matlab代码实现部分,逐步运行并理解模型构建、约束设定与求解流程,重点关注储能衰减建模与灵活性资源协调机制的设计思路,宜配合YALMIP、CPLEX等工具包进行调试与优化

57,064

社区成员

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

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