推广 热搜: 广场  Java  Word  app  营业  微信公众号  北京代理记账  商城  代理记账  商标交易 

mysql用in查询大量数据 mysql中in嵌套select只能查询出一个结果?

   2023-04-28 企业服务招财猫40
核心提示:我我从未见过如此松散的笔迹...每当你执行以下是sqlserver数据库的一个示例。select*fromtableawherebin(selectbfromtableagroupbybhavingc

我我从未见过如此松散的笔迹...每当你执行

以下是sqlserver数据库的一个示例。

select*fromtableawherebin(selectbfromtableagroupbybhavingcount(b)gt1)这样就列出了b字段中所有重复的数据,你可以根据对应的行号得到行号。

如果要查询字段A或字段C的重复数据,可以相应地将上述字段B替换为字段A或字段C。例如:

1.创建表stud:select*fromstudentwherenamein(selectnamefromstudentgroupbynamehavingcount(

1.从MySQL5.6版本5.6开始,其中in已经过优化,并且是索引的。当你用EXPLAIN分析你的SQL的时候,你会发现所有的类型都是range,也就是说你使用索引范围,通过索引字段range查询得到表中的一些数据记录。

2.在MySQL5.5版本中,虽然wherein不会取索引,但是这个版本在以下情况下优化了wherein,比如select*fromaWHEREIDIN(selecta_IDfromb)会优化为select*fromaWHEREexists(select*fromb

我来说说这个问题:

题目提到的查询应该是这样的:select*fromawhereidin(selectidfromb)。

对于这个sql语句,它的执行计划不是先查询表B的所有id,然后再与表A的id进行比较会将in子查询转换成现有的相关子查询,所以实际上相当于这个sql语句:select*fromawhereexists(select*fromb循环出表A中的每一条记录并与表B进行比较,比较的条件是看表A中每一条记录的id是否存在于表B中,如果存在,则返回表A中的这条记录..

exists查询的缺点是什么?

根据exists的实现原理,表A(外观)不能被索引,必须扫描整个表,因为表A的数据在表B中查,而你必须用表A的数据在表B中查(从外到内),顺序是固定的。

如何优化?

索引。但是从上面的分析可以看出,索引只能建立在表B的id字段中,而不能建立在表A的id中,mysql可以不要用它。

这样优化就够了吗?Itit'还是有点短。

因为exists查询其执行计划,所以它只能将表A中的数据取到表B中(从表外到表内),尽管它可以在表B的id字段中建立索引以提高查询效率。

然而,你可以t从表B到表A依次取数据,exists子查询的查询顺序是固定的。

为什么反过来呢?

因为你首先可以确定的是,反过来的结果是一样的。这就引出了一个更详细的问题:当两个表的id字段都有索引时,是表A查表B的效率高还是表B查表A的效率高?

如何进一步优化?

将查询修改为innerjoin连接查询:select*fromaninnerjoinbon(但这还不够,再往下看)。

为什么不用左连接和右连接?

此时,表之间的连接顺序是固定的,

例如,左连接意味着必须先检查左表并扫描整个表,然后逐个转到另一个表,右连接也是如此。仍然不是最佳选择。

为什么我可以只使用内部连接?

内连接中的两个表,比如A内连接B,但是实际执行顺序和写的顺序无关,最后执行的可能是B连接A,顺序不固定。如果on条件字段有索引,也可以使用较高的索引。

那怎么才能知道A和B的执行顺序哪个更有效率呢?

你不我不知道,我也不知道。谁知道呢?Mysql知道的。让mysql自己判断(查询优化器)。mysql查询优化器将评估每个案例的成本,并最终选择最佳的一个作为执行计划。

在内心在join连接中,mysql将评估是使用表A查找表B更高效,还是使用表B查找表A更高效。如果两个表都有索引,mysql还将评估表A的条件字段上的索引效率是更高还是更高..

我们需要做的是对两个表的连接条件的两个字段进行索引,然后解释,检查执行计划,看mysql使用了哪个索引,最后去掉没有使用索引的表的字段索引。

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
合作伙伴
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  冀ICP备2023006999号-8