暂无图片
mysql自查询中有主键使用in和主键使用=的区别
我来答
分享
暂无图片 匿名用户
mysql自查询中有主键使用in和主键使用=的区别

原查询

select * from t where t.id in (select max(id) from t where t.name='xxx' and t.age=11);自查询由于有name索引只扫描1行就能查到结果,但是主键却使用扫描全表。将语句换成select * from t where t.id = (select max(id) from t where t.name='xxx' and t.age=11);后语句均扫描1行即可得到结果。这是为什么?

我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
伟鹏

select * from t where t.id in (select max(id) from t where t.name='xxx' and t.age=11);  是一个半连接查询“ (select max(id) from t where t.name='xxx' and t.age=11)” 是一个子查询,()里的表作为驱动表,驱动表查询一次,被驱动表T就会做一次全表扫描。

select * from t where t.id = (select max(id) from t where t.name='xxx' and t.age=11);”  作为等值连接,走索引扫描。


暂无图片 评论
暂无图片 有用 4
打赏 0
广州_老虎刘

首先是sql写法的问题, 既然已知子查询只会返回一条记录, 那就不应该写in, 直接写=, 效率是没问题的, 这种是最简单的自关联,如果改用order by id desc limit 1, 效率还能更高一点;  

其次是mysql优化器的问题, 它的查询转换规则有点少, oracle和pg对这种in的写法也可以得到高效的执行计划.  优化器水平不行, 对SQL写法的要求就更高, 像 select * from t1 a where id = (select max(id) from t1 b where a.owner=b.owner); 这种自关联写法的SQL,  mysql基本上就完全蒙圈了, pg比myql强点, 最好的执行计划还是oracle.

暂无图片 评论
暂无图片 有用 0
打赏 0
chengang

外表和子查询的表 都是t 所以我们从语句中无法看出是关联子查询还是非关联子查询


暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
id是地点编号,name是人员名称,求接触过的人员集合。有人会不?
回答 1
这个问题的本质应该是求并查集(unionfind)可以搜索看看相关的代码算法
sql ,执行报错:临时表空间不足,运行失败。给临时表空间加空间 ,结果临时表空间加到了2个T,才不报错。
回答 1
已采纳
得看看你的sql是怎么关联的,实际数据可能很小,结果sql连接或者嵌套弄出来的结果集比较大,然后排序跟分组就会用到很大的临时表空间
在PL/SQL DEV里可以跑awrrpt.sql生成AWR吗?
回答 3
已采纳
需要将如下四个文件下载:然后就可以执行了。希望能帮助到你!
触发器 操作的是2张不同的表 提示: Can't update table 'test' ,update 的那张表 没有任务的关联触发器,是什么原因?
回答 1
这个提示像是触发器代码中,对触发器中涉及的表又做了DML操作,这可能会导致死循环。即一个初始的UPDATE,导致调用了触发器,而触发器又对这个表做了UPDATE,这次的UPDATE又会导致再次调用触发
MySQL的约束有哪些?
回答 5
已采纳
NOTNULL:约束字段的内容一定不能为NULL。UNIQUE:约束字段唯一性,一个表允许有多个Unique约束。PRIMARYKEY:约束字段唯一,不可重复,一个表只允许存在一个。FOREIGNKE
MySQL8.0 报错:ERROR 1290:the mysql server is running with the secure-file-priv option so it cannot execute this statement
回答 1
已采纳
看下参数,是不是限制路径了SHOWGLOBALVARIABLESLIKE'%secure%';或者配置文件中设置下securefilepriv''参数,不限制目录;
mysql有几种安装方式?
回答 1
已采纳
MySQL有以下几种安装方式:二进制安装包:从官方网站下载二进制安装包,解压并配置环境变量,然后运行安装脚本进行安装。源码编译安装:从官方网站下载源码包,解压后进行编译和安装。软件包管理器安装:使用系
下图中这个结果行转列怎么最好
回答 2
已采纳
withcteas(select1asid,&x27;aaa&x27;asvunionallselect2asid,&x27;bbb&x27;asvunionallselect3asid,&x27;c
mysql单个节点最大并发一般是多少?
回答 1
最大并发是16384,另外这个也得看服务器资源比如CPU、内存等。
rc下,单独执行每个只有1个行锁,为啥2个会话会发生锁等待?
回答 1
因为没有索引,RC是扫描后放弃掉不符合要求退化为行锁。当还没有退化的时候,就已拿不到锁了。所以就会堵塞。