MySql如何使用not in实现优化_Mysql

来源:脚本之家  责任编辑:小易  

not In 相当于 <> all,如果 Not In 后面跟的是子查询的话,子查询中只

最近项目上用select查询时使用到了not in来排除用不到的主键id一开始使用的sql如下:

你的语句可以这样写:select * from users where userid

select   s.SORT_ID,   s.SORT_NAME,   s.SORT_STATUS,   s.SORT_LOGO_URL,   s.SORT_LOGO_URL_LIGHT from SYS_SORT_PROMOTE s   WHERE     s.SORT_NAME = '必听经典'     AND s.SORT_ID NOT IN ("SORTID001")   limit 1;

delete from wc where id not in(1,2,3,9) 的语法是错误的 de

表中的数据较多时这个sql的执行时间较长、执行效率低,在网上找资料说可以用 left join进行优化,优化后的sql如下:

一般用in的时候需要加括号的,$sql="select * from biao where

select   s.SORT_ID,   s.SORT_NAME,   s.SORT_STATUS,   s.SORT_LOGO_URL,   s.SORT_LOGO_URL_LIGHT from SYS_SORT_PROMOTE s left join (select SORT_ID from SYS_SORT_PROMOTE where SORT_ID=#{sortId}) b on s.SORT_ID = b.SORT_ID   WHERE     b.SORT_ID IS NULL     AND s.SORT_NAME = '必听经典'   limit 1;

MySQL中NOT IN语句对NULL值的处理2007-07-23 16:01mysql> S

上述SORT_ID=#{sortId} 中的sortId传入SORT_ID这个字段需要排除的Id值,左外连接时以需要筛选的字段(SORT_ID)作为连接条件,最后在where条件中加上b.SORT_ID IS NULL来将表中的相关数据筛选掉就可以了。

临床上经常能见到新生儿溶血症,该病的根本发病原因就是夫妻血型不合。新生儿溶血症既然是夫妻血型不合造成的,那么是否每个人都要跟血型相同的人结婚呢?专家表示,没有任何证据表明必须血型相同才能结婚。夫妻血型不合现象很普遍,所以新生儿溶血症也很常见,但是该病一般都能及时发现、及时治疗,几乎都能治愈,不会对孩子未来的健康造成影响。据了解,新生儿溶血症的原因主要分为两种:ABO血型系统不合,Rh血型系统不合。在我国,最常见的是ABO血型系统不合,ABO溶血病患儿的母亲多为O型血,婴儿多为A型或者B型。如果丈夫是A、B或者AB血型,妻子是O血型,且有过流产史或者输血史,怀孕时应该想到这个问题,必要时可征求医

这里写下随笔,记录下优化过程。

我觉得大多数回答都是在危言耸听,洗发水致癌吗,会导致你脱发吗,这些说法太可笑了点,但是仍然有许多人在以讹传讹,其中不乏有些卖无硅油或者小众品牌的商家,因为如果不诋毁正常的品牌,那么怎么才能把自己手里的产品卖出去呢?其实我们看看网络上的一些新闻,这样的谣言层出不穷,比如:大多数谣言主要来自于洗发水中的以下几个成份:防腐剂防腐剂其实永远是化妆品里面的一个争议焦点,因为人们本能地认为防腐剂既然能杀死细菌,也能对人体产生一定的危害性。虽然此言不假,但是细菌和人还是有本质区别的,而且如果防腐剂的量不足,你的产品还有可能会变成像下图这样惨不忍睹。确实,有许多洗发水迫于成本和配方的压力,可能会用一些比较落后

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

mysql not in如何优化

首先,你现在写的这个sql是不能查询到你描述的结果的。

c表(xl_account),没看明白是干什么的的,先不管吧

a,b 两表通过id进行关联,应该是可以认为id相同则是同一(人)条记录

name不同应可以认为是做了修改,你用not in 则说明是不存在。假如,有2行记录,将名称互换,应该是两行都修改了,但是按照你现在的sql来看是应属于in的范围,not in 无法显示的,也就是查不出来。

所以,首先not in 改为 不等(!=), 才应该是你要找的数据。这样效率也是有所提高的。

若想要找到哪条记录修改,且要查询改前和改后的值,那么没有什么修改空间了,如果要查出哪条修改过,则有

select * from kd_user a 

where  not exists (

    select 1 from lx_user b where a.id=b.id and a.name=b.name

)追问经理给的任务是:一张原表kd_user分离出来两张子表,xl_user和xl_account,xl_user和原表关联字段是id,xl_account和xl_user关联是userId和id外键,任务是要查出原表id和原表的name字段+原表uuid+现在xl_user修改后的name+xl_uuid+xl_account修改后的name,还要考虑sql优化已经性能存储问题追答xl_account 的 userid 为啥是个外键?是否xl_account中每个人存在多个记录?修改一次存一条?

如果要考虑性能问题,那么要知道你的数据特征。

如果你的kd_user 中数量不超过1W,而在子表中修改量不低于20%,那么join 和left join 应能很好的满足你的要求。

若,你的主表中数量在10W这个数量级以上,且修改量极少,小于5%,那么先用临时表查到修改的数据,也就是not exists。然后再用临时表和 2个子表关联。

MYSQL NOT IN优化

算法上存在很大问题。我们先来分析该算法的执行次数。

按照你的方法,record表中的id字段要全部查询一遍,也就是2W次查询,而每次查询,最坏

情况下需要与offline_record中的rec.id进行4W次比较,这又导致offline_record表的4W次

查询(取rec_id )。假设满足

a.* from record a where a.id not in(select b.rec_id from offline_record);

条件的记录一共有N条,那么,最坏情况下,该算法所做的查询次数为:

2W(取record.id)+2W*4W(每取一次record.id就要取一次offline_record.rec_id且offline_record的最后一条数据满足条件)+N(每

条满足条件的记录需要再在record中取该记录全部数据)

所做的比较次数为:

2W*4w

考虑最好情况下的效率,该算法所做的查询次数为:

2W(取record.id)+2W*1(每取一次record.id就要取一次offline_record.rec_id且offline_record的第一条数据满足条件)+N(N(每

条满足条件的记录需要再在record中取该记录全部数据)

所做的比较次数为:

2W*1

因此,该算法平均查询次数为:

2W+(4w*2w+1)*2w/2+N ->8*10^12

天文数字!这还不考虑将近4亿次的平均比较次数,所以你的执行效率当然低了

下面,我们对该算法来进行优化:

算法主要解决的问题是,取表record中id不等于offline_record.rec_id的数据。现假定id为record的主键(你的问题没有指明,但是你会看到无论id是否主键都不影响分析),设计算法如下:

1、取offline_record.rec_id的结果为集合,并对该集合进行排序,设最终生成的集合为A 。则,查询数据库4w次,生成集合的算法按照O(N*ln N)的效率来算平均情况下比较O(4W*ln 4w),约等于64W次,排序次数按照O(N*ln N)的效率来算平均情况下比较O(4W*ln 4w),约等于64W次。

2、顺序取record中的id与第一步生成的集合A进行比较,从而得出最终结果。该过程中由于record.id与A均为有序表,所以比较次数为2w次,查询次数为2w+N次。

如上算法,查询次数为 4W+2W+N=6W+N次,平均比较次数为 64W+64W+2W=130w次。

显而易见,该算法对原算法进行了最大的优化,大概将速度提高了10*8倍。

考虑到对数据库的查询时间远远大于排序比较时间,改进厚的算法在实际操作中还会有更好的表现。

至于你对mysql查询语句的优化,则是治标不治本之举,虽然有用,但毕竟是微小量变,不足与影响全局,在一个坏的算法下,几乎不能提升性能。

mysql百万数据查询 用什么代替in,该如何处理

mysql百万数据查询用exists 代替 in 是一个好的选择:

select num from a where num in(select num from b) 

用下面的语句替换:

select num from a where exists(select 1 from b where num=a.num)

SQL查询语句优化方法: 

1、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

2、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

3、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num is null

可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

select id from t where num=0

4、尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num=10 or num=20

可以这样查询:

select id from t where num=10

union all

select id from t where num=20

5、下面的查询也将导致全表扫描:(不能前置百分号)

select id from t where name like ‘%c%’

若要提高效率,可以考虑全文检索。

本回答被网友采纳

mysql中not in怎么使用?

not In 相当于 <> all,如果 Not In 后面跟的是子查询的话,子查询中只要包含一个 null 的返回值,则会造成整个 Not in 字句返回空值,结果就是查询不会返回任何结果。而 in 相当于 =any 的意思,可以有效处理子查询中返回空值的情况,返回正确的结果。

mysql中not in和not exists两种查询到底哪种快?

因为in会使用你的子查询字段去到主表匹配你需要的行,而exists是根据匹配项去判断是或者否,然后根据是否决定结果,子查询的表大,用exists判断,效率就会高,而当子查询很小的时候,直接匹配你需要的值则更快。比如主表4万行,子查询里面有5条数据,那么exists会把4万行在子查询里面进行匹配,匹配上了就显示,匹配不上就不显示,所以需要判断4万次,而in则会在主表4万行里面去检索这5条记录,由于索引等等的存在,in的效率通常会更高,但是如果反过来,主表5条记录,子查询里面有4万行,exists只进行5次判断,而in会用4万个数据去匹配这5条记录,当然exists更快。


  • 本文相关:
  • mysql中not in填坑之列为null的问题解决
  • 解决大于5.7版本mysql的分组报错expression #1 of select list is not in group by clause and contains nonaggregated
  • mysql:the user specified as a definer (''xxx@''%'') does not exist的解决方案
  • mysql添加外键时报错:1215 cannot add the foreign key constraint的解决方法
  • 解决mysql5.1安装时出现cannot create windows service for mysql.error:0
  • mysql中对于not in和minus使用的优化
  • mysql 启动报错:file ./mysql-bin.index not found (errcode: 13)
  • mysql: mysql is not running but lock exists 的解决方法
  • 深入mysql "on duplicate key update" 语法的分析
  • 关于mysql init_connect的几个要点总结
  • mysql 可以用localhost 连接,但不能用ip连接的问题解决方法
  • mysql重定位数据目录的方法
  • mysql 5.7如何安装 mysql 5.7安装配置教程
  • 老生常谈mysql event事件调度器(必看篇)
  • jdbc连接mysql处理中文时乱码解决办法详解
  • linux自动备份mysql数据库脚本代码
  • mysql中explain用法详解
  • mysql实现多表关联统计(子查询统计)示例
  • mysql not in如何优化
  • MYSQL NOT IN优化
  • mysql百万数据查询 用什么代替in,该如何处理
  • mysql中not in怎么使用?
  • mysql not in 效率
  • mysql中not in怎么使用
  • sql中的not in语句怎样用mysql表示
  • Mysql不支持not in吗
  • mysql not in语句的用法
  • mysql 查询问题 关于 not in
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页mysqlmysql中not in填坑之列为null的问题解决解决大于5.7版本mysql的分组报错expression #1 of select list is not in group by clause and contains nonaggregatedmysql:the user specified as a definer (""xxx@""%"") does not exist的解决方案mysql添加外键时报错:1215 cannot add the foreign key constraint的解决方法解决mysql5.1安装时出现cannot create windows service for mysql.error:0mysql中对于not in和minus使用的优化mysql: mysql is not running but lock exists 的解决方法深入mysql "on duplicate key update" 语法的分析关于mysql init_connect的几个要点总结mysql 可以用localhost 连接,但不能用ip连接的问题解决方法mysql重定位数据目录的方法mysql 5.7如何安装 mysql 5.7安装配置教程老生常谈mysql event事件调度器(必看篇)jdbc连接mysql处理中文时乱码解决办法详解linux自动备份mysql数据库脚本代码mysql中explain用法详解mysql实现多表关联统计(子查询统计)示例mysql安装图解 mysql图文安装教程can""t connect to mysql serverwindows下mysql5.6版本安装及配置mysql字符串截取函数substring的mysql创建用户与授权方法mysql提示:the server quit withmysql日期数据类型、时间类型使用mysql——修改root密码的4种方法mysql update语句的用法详解mysql 的case when 语句使用说明mysql实现类似于connect_by_isleaf的功能使用xtrabackup实现mysql备份mysql的索引详解mysql导入csv文件或制表符分割的文件windows10下mysql 8.0.16 安装配置方法图mysql本地安装以及出现的问题解决解析mysql隐式转换问题基于mysq字段选择的详解关于mysql init_connect的几个要点总结mysql建库时提示specified key was too l
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved