当前位置:首页 > 技术 >

数据库exists用法(数据库in和exists的效率如何)

来源:原点资讯(www.yd166.com)时间:2023-11-02 06:50:18作者:YD166手机阅读>>

一、用法

1. 与IN结合使用

  • 子查询与IN结合使用时,通常通过子查询查询出某个表单列的值,然后作为外层的SELECT的IN查询的数据源,如下,查询今天进行了购物的用户列表,首先通过子查询在订单表t_order查出所有今天进行了购物的用户的user_id,然后在外层SELECT中对于用户表t_user的每个用户都通过IN来判断自己的user_id是否在里面:

数据库exists用法,数据库in和exists的效率如何(1)

  • 执行计划如下:

数据库exists用法,数据库in和exists的效率如何(2)

性能分析:数据集合 O(N)线性时间复杂度

  • 对于外层SELECT对应用户表t_user的每一行数据都要执行一次这个子查询,而这个子查询是需要返回一个数据集合而不是单条数据,然后再判断外层SELECT的当前数据行的该列的值是否在这个集合中,类似于O(N)的线性时间复杂度,如Java的集合的contains方法,所以性能是很低的,即MySQL需要返回的数据量大同时查询的时间复杂度高。

2. 与EXISTS结合使用

  • 在外层SELECT中,除了可以通过IN来使用子查询的结果外,还可以通过EXISTS,如下:与IN不同的是,在子查询中外层的t_user表需要在子查询内使用,在子查询内部才是进行实际的查询,而EXISTS的作用是根据EXISTS返回的结果,即boolean类型的true或false来决定是否需要返回该外层SELECT当前遍历到的结果。

mySQL> select * from t_user where exists (select * from t_order where t_user.id=t_order.user_id and t_order. buy_date=curdate()); ---- ------ ---------------------------------- ------------ -------- | id | name | password | email | phone | ---- ------ ---------------------------------- ------------ -------- | 2 | xyz2 | 5838eec5e44b83f35c2763382b45e469 | 456@qq.com | 456789 | ---- ------ ---------------------------------- ------------ -------- 1 row in set (0.00 sec)

  • 执行计划如下:

mysql> explain select * from t_user where exists (select * from t_order where t_user.id=t_order.user_id and t_order. buy_date=curdate()); ---- -------------------- --------- ------------ ------ ----------------------------------------------- -------------- --------- ------- ------ ---------- ------------- | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | ---- -------------------- --------- ------------ ------ ----------------------------------------------- -------------- --------- ------- ------ ---------- ------------- | 1 | PRIMARY | t_user | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | Using where | | 2 | DEPENDENT SUBQUERY | t_order | NULL | ref | idx_user_id,idx_user_id_buy_date,idx_buy_date | idx_buy_date | 3 | const | 1 | 25.00 | Using where | ---- -------------------- --------- ------------ ------ ----------------------------------------------- -------------- --------- ------- ------ ---------- ------------- 2 rows in set, 2 warnings (0.00 sec)

性能分析:True或False的boolean值 O(1)常量时间复杂度

  • 执行计划与IN差不多,外层SELECT的type都是ALL,即全表扫描,但是EXISTS的执行过程与IN不一致,对于EXISTS而言,外层SELECT对应的用户表t_user也参与到了子查询的SQL中,即 where t_user.id=t_order.user_id,故如果子查询的结果不为空,即存在数据,则外层SELECT对应的t_user表的当前数据行肯定是符合要求的,故该子查询实际上并不返回任何数据,而是返回值True或False,不需要与IN一样返回一个数据集合。
  • 而对外层SELECT来说,通过EXISTS判断子查询返回的boolean值True或者False来判断当前数据行是否符合要求,故时间复杂度为常量级别O(1)。

二、优化方法

1. 使用EXISTS替代IN

  • 由以上的分析可知,在使用子查询时,将EXISTS结合使用比与IN结合使用效率更高,所以可以使用EXISTS来替代IN。

2. 使用JOIN替代子查询

  • 子查询不管是使用IN还是EXISTS,对外层SELECT对应的数据表均需要进行全表扫描,并且对于每行数据都需要执行一次子查询,所以如果该数据行表很大,则需要执行大量的子查询,,即可能出现“大表驱动小表”,从而产生性能问题。
  • 对于JOIN而言,由于可以通过“小表驱动大表”,并且进行JOIN的列都加了索引,所以可以一定程度上优化子查询,如下:还是查询今天进行了购物的用户:

数据库exists用法,数据库in和exists的效率如何(3)

3. 子查询和JOIN均不用,程序控制

  • 如果数据表较大时,使用子查询和JOIN效率均不高,并且对于JOIN而言,会影响分库分表的使用,故可以对需要关联的表分别查询出来,然后在程序中进行数据拼接组装操作,从而减轻数据库的压力,因为数据库通常是应用的性能瓶颈,而应用程序通常可以进行分布式和集群部署来拓展。
  • 除此之外,对于拼接的结果可以缓存到分布式缓存,如Redis中,从而可以重复使用。

栏目热文

评分最高的十部商战剧(最经典的商战剧是哪十部)

评分最高的十部商战剧(最经典的商战剧是哪十部)

《伟大的时代》:商战与疯狂,胜者为王。《大时代》是一部经典的电视剧,剧中丁蟹的形象塑造得十分立体,引人入胜。尤其是在法庭...

2023-11-02 06:50:08查看全文 >>

矩阵国际在哪个区(矩阵国际属于哪个区)

矩阵国际在哪个区(矩阵国际属于哪个区)

25日下午,2023“一带一路”媒体合作论坛联合采访团成员在湖南长沙黄花国际机场T3航站楼项目新型智慧安全体验中心,通过...

2023-11-02 07:03:29查看全文 >>

商业电视剧排行榜前十名(必看的十大商业电视剧排行榜)

商业电视剧排行榜前十名(必看的十大商业电视剧排行榜)

1、《大时代》丁蟹太特别了,极度自私,极度偏激,始终自认为自己是圣人。自己没有多大本事,运气却极好。这种坏人太特别了,道...

2023-11-02 07:27:52查看全文 >>

内地商战电视剧排行榜前十名(好看的商战电视剧排行榜前十名)

内地商战电视剧排行榜前十名(好看的商战电视剧排行榜前十名)

一. 《义不容情》《义不容情》是香港电视广播有限公司出品的一部时装剧。由韦家辉监制、李国立、叶昭仪、袁英明等执导,由黄日...

2023-11-02 07:17:55查看全文 >>

古装经商电视剧排行榜前十名(做生意的古装电视剧排行榜前十名)

古装经商电视剧排行榜前十名(做生意的古装电视剧排行榜前十名)

一、《莲花楼》主演:成毅 曾舜晞 肖顺尧剧情简介:该剧讲述了闻名武林的四顾门门主李相夷在一次大战后身受重伤,从此退隐江湖...

2023-11-02 07:02:15查看全文 >>

sql语句中的exists用法(sql中exists与in区别)

sql语句中的exists用法(sql中exists与in区别)

1、简介• 不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询• 相关子查询:子查询的查询条件依赖于外层父查...

2023-11-02 07:10:48查看全文 >>

exists中文是什么(exists汉语是什么)

exists中文是什么(exists汉语是什么)

高中一年级英语必修2单词Unit5classical/'klæsɪkl/adj.古典的;经典的。classic(...

2023-11-02 07:24:00查看全文 >>

exists关键字的用法(exists方法的作用是)

exists关键字的用法(exists方法的作用是)

EXISTS语法:SELECT 字段 FROM table WHERE EXISTS (subquery); 参数:su...

2023-11-02 07:33:41查看全文 >>

exists函数怎么用(exists查询的语句格式)

exists函数怎么用(exists查询的语句格式)

概述抽空总结一下mysql的一些概念性内容,涉及存储过程、函数、视图、触发器等。一、查看存储过程、函数、视图、触发器、表...

2023-11-02 07:23:53查看全文 >>

exists的用法(exist用法和注意事项)

exists的用法(exist用法和注意事项)

概述一般在做SQL优化的时候讲究使用exists带替代IN的做法,理由是EXISTS执行效率要比IN高。个人理解:IN表...

2023-11-02 06:52:45查看全文 >>

文档排行