加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

同事用这2个小技巧,让SQL语句效率提升了1000倍

发布时间:2019-08-24 09:03:34 所属栏目:编程 来源:JavaLeader
导读:本次来讲授与 SQL 查询有关的两个小常识点,把握这些常识点,可以或许让你停止踩坑以及进步查询服从。 1. 应承字段的值为 null,每每会激发劫难 起首,先筹备点数据,后头好演示 createtableanimal( idint, namechar(20), index(id) )engine=innodb; index(id)
副问题[/!--empirenews.page--]

同事用这2个小能力,让SQL语句服从晋升了1000倍

本次来讲授与 SQL 查询有关的两个小常识点,把握这些常识点,可以或许让你停止踩坑以及进步查询服从。

1. 应承字段的值为 null,每每会激发劫难

起首,先筹备点数据,后头好演示

  1. create table animal( 
  2. id int, 
  3. name char(20), 
  4. index(id) 
  5. )engine=innodb; 

index(id) 暗示给 id 这个字段建设索引,而且 id 和 name 都应承为 null。

接着插入4条数据,个中最后一条数据的 id 为。

  1. insert into animal(id, name) values(1, '猫'); 
  2. insert into animal(id, name) values(2, '狗'); 
  3. insert into animal(id, name) values(3, '猪'); 
  4. insert into animal(id, name) values(null, '无名动物'); 

此时表中的数据为

同事用这2个小能力,让SQL语句服从晋升了1000倍

这时我们查询表中 id != 1 的动物有哪些

  1. select * from animal where id != 1; 

功效如下:

同事用这2个小能力,让SQL语句服从晋升了1000倍

此时我们只找到了两行数据,按原理应该是三行的,可是 id = null 的这一行居然没有被匹配到,,也许各人传闻过,null 与任何其他值都不相称,按原理 null != 1 是创立的话,然而实际很残忍,它就是不会被匹配到。

以是,武断不应承字段的值为 null,不然也许会呈现与预期不切合的功效。

横竖我之前有踩过这个坑,不知道各人踩过木有?

可是万一有人配置了应承为 null 值怎么办?假如然的这样的话,对付 != 的查找,后头可以多加一个 or id is null 的子句(留意,是 is null,不是 = null,由于 id = null 也不会匹配到值为 null 的行)。即:

  1. select * from animal where id != 1 or id is null; 

功效如下:

同事用这2个小能力,让SQL语句服从晋升了1000倍

2. 尽也许用 union 来取代 or

(1)、适才我们给 id 这个字段成立了索引,假如我们来举办等值操纵的话,一样平常会走索引操纵,不信你看:

  1. explain select * from animal where id = 1; 

功效如下:

同事用这2个小能力,让SQL语句服从晋升了1000倍

通过执行打算可以望见,id 上的等值查找可以或许走索引查询(预计在你的料想之中),个中

  • type = ref :暗示走非独一索引
  • rows = 1 :猜测扫描一行

(2)、那 id is null 会走索引吗?答是会的,如图

  1. explain select * from animal where id is null; 

同事用这2个小能力,让SQL语句服从晋升了1000倍

个中

  • type = ref :暗示走非独一索引
  • rows = 1 :猜测扫描一行

(3)、那么题目来了,那假如我们要找出 id = 1 可能 id = null 的动物,我们也许会用 or 语句来毗连,即

  1. select * from animal where id = 1 or id is null; 

那么这条语句会走索引吗?

有没有走索引,看执行打算就知道了,如图

  1. explain select * from animal where id = 1 or id is null; 

同事用这2个小能力,让SQL语句服从晋升了1000倍

个中:

  • ref = ALL:暗示全表扫描
  • rows = 4 :猜测扫描4行(而我们整个表就只有4行记录)

通过执行打算可以看出,行使 or 是很有也许不走索引的,这将会大大低落查询的速度,以是一样平常不提议行使 or 子句来毗连前提。

那么该怎样办理?

着实可以用 union 来代替 or,即如下:

  1. select * from animal where id = 1 union select * from animal where id is null. 

同事用这2个小能力,让SQL语句服从晋升了1000倍

此时就会别离走两次索引,找出全部 id = 1 和 全部 id = null 的行,然后再用一个姑且表来存放最终的功效,最后再扫描姑且表。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读