关于mysql or 的 底层执行

来源:互联网 发布:程序员必会的语言 编辑:程序博客网 时间:2024/06/06 09:55

一直 有一个 疑问 mysql 的 or  到底是怎么执行的

例如  select  * from  user   where createtime=1474253267  or    name='zs'  or  class =123

已知 表中存在  满足 createtime   name  class 其中一个的条件的数据有且只有一条 , 且同时满足其3个条件


有疑问 mysql 在筛选数据的时候  对于or  有没有短路 情况  即  满足 or 条件 其中的 一个 即返回数据 不执行之后的 的 or 条件

如果存在 短路情况 则必然存在

S select  * from  user   where createtime=1474253267  or    name='zs'  or  class =123 和 以下3条

A  select  * from  user   where createtime=1474253267 

B  select  * from  user   where name='zs'

C  select  * from  user   where  class =123 

其中的 一条的执行 时间 相同

在通过 重复插入 上述 相同条件后得出结论   并不存在短路情况 即 原sql 语句和的 执行 时间都大于 abc  


疑惑 mysql 在执行 or 条件时 底层的执行 情况

猜想 mysql  并不是 在逐行 对 多个or 条件进行 比较 而是对单个列 直接 逐行 比 对    一个or条件比对完成 再对下一个or条件 比对 直至完成 .

如果 这样理解 可以解释 以上原 sql  执行 情况都大于ABC  ,但是这种 明显 为  UNION ALL 执行的 情况  ,而 or 和 UNION ALL 在执行效率 和 执行过程 有明显差异

故否定 此猜想

且发现  D select  * from  user   where createtime=1474253267  and    name='zs'  and  class =123  在理论上筛选的过程 使用的条件 和得到的数据 都应该相同 ,故 执行 时间 应该类似.但执行时间结果为 S>D>(A或B或C) 很是不理解


希望得到 大牛 帮助

0 0
原创粉丝点击