Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >两个小技巧,让SQL语句不仅躲了坑,还提升了1000倍

两个小技巧,让SQL语句不仅躲了坑,还提升了1000倍

作者头像
数据和云
发布于 2019-08-08 15:06:08
发布于 2019-08-08 15:06:08
54400
代码可运行
举报
文章被收录于专栏:数据和云数据和云
运行总次数:0
代码可运行

本次来讲解与 SQL 查询有关的两个小知识点,掌握这些知识点,能够让你避免踩坑以及提高查询效率。

1. 允许字段的值为 null,往往会引发灾难

首先,先准备点数据,后面好演示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create table animal(
id int,
name char(20),
index(id)
)engine=innodb;

index(id) 表示给 id 这个字段创建索引,并且 id 和 name 都允许为 null。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert into animal(id, name) values(1, '猫');
insert into animal(id, name) values(2, '狗');
insert into animal(id, name) values(3, '猪');
insert into animal(id, name) values(null, '无名动物');

注意:代码块可以左右拉动

此时表中的数据为

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from animal where id != 1;

结果如下:

此时我们只找到了两行数据,按道理应该是三行的,但是 id = null 的这一行居然没有被匹配到,,可能大家听说过,null 与任何 其他值都不相等,按道理 null != 1 是成立的话,然而现实很残酷,它就是不会被匹配到。

所以,坚决不允许字段的值为 null,否则可能会出现与预期不符合的结果。

反正我之前有踩过这个坑,不知道大家踩过木有?

但是万一有人设置了允许为 null 值怎么办?如果真的这样的话,对于 != 的查找,后面可以多加一个 or id is null 的子句(注意,是 is null,不是 = null,因为 id = null 也不会匹配到值为 null 的行)。即

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from animal where id != 1 or id is null;

结果如下:

2. 尽可能用 union 来代替 or


(1)、刚才我们给 id 这个字段建立了索引,如果我们来进行等值操作的话,一般会走索引操作,不信你看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
explain select * from animal where id = 1;

结果如下:

通过执行计划可以看见,id 上的等值查找能够走索引查询(估计在你的意料之中),其中

type = ref :表示走非唯一索引 rows = 1 :预测扫描一行

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
explain select * from animal where id is null;

其中

type = ref :表示走非唯一索引 rows = 1 :预测扫描一行

(3)、那么问题来了,那如果我们要找出 id = 1 或者 id = null 的动物,我们可能会用 or 语句来连接,即

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from animal where id = 1 or id is null;

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

有没有走索引,看执行计划就知道了,如图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
explain select * from animal where id = 1 or id is null;

其中:

ref = ALL:表示全表扫描

rows = 4 :预测扫描4行(而我们整个表就只有4行记录)

通过执行计划可以看出,使用 or 是很有可能不走索引的,这将会大大降低查询的速率,所以一般不建议使用 or 子句来连接条件。

那么该如何解决?

其实可以用 union 来取代 or,即如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from animal where id = 1 union select * from animal where id is null.

此时就会分别走两次索引,找出所有 id = 1 和 所有 id = null 的行,然后再用一个临时表来存放最终的结果,最后再扫描临时表。

3、总结

1、定义表的时候,尽量不允许字段值为 null,可以用 default 设置默认值。

2、尽量用 union 来代替 or,避免查询没有走索引。

3、注意,用 id = null 的等值查询,也是不会匹配到值为 null 的行的,而是应该用 id is null。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据和云 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【MySQL系列】- MySQL执行计划一览
根据表、列、索引和WHERE子句中的条件的详细信息,MySQL优化器考虑了许多技术来有效地执行SQL查询中涉及的查找。对一个巨大表的查询可以在不读取所有行的情况下执行;涉及多个表的联接可以在不比较每个行组合的情况下执行。「优化器选择执行最有效查询的操作集称为“查询执行计划(query execution plan)”,也称为EXPLAIN计划。」
索码理
2022/12/28
8120
【MySQL系列】- MySQL执行计划一览
阿里一面:SQL 优化有哪些技巧?
当然这个还是非常有实用价值的,工作中你也一定用的上。如果应用得当,升职加薪,指日可待
微观技术
2022/05/27
3900
阿里一面:SQL 优化有哪些技巧?
两万字SQL优化大全
左边的client可以看成是客户端,客户端有很多,像我们经常你使用的CMD黑窗口,像我们经常用于学习的WorkBench,像企业经常使用的Navicat工具,它们都是一个客户端。右边的这一大堆都可以看成是Server(MySQL的服务端),我们将Server在细分为sql层和存储引擎层。
大数据老哥
2022/04/07
8290
两万字SQL优化大全
神奇的 SQL 之 MySQL 性能分析神器 → EXPLAIN,SQL 起飞的基石!
  某一天,楼主打完上班卡,坐在工位逛园子的时候,右下角的 QQ 闪了起来,而且还是个美女头像!我又惊又喜,脑中闪过我所认识的可能联系我的女性,得出个结论:她们这会不可能联系我呀,图像也没映象,到底是谁了?打开聊天窗口聊了起来
青石路
2019/11/27
6050
Explain 执行计划 和 SQL优化
在分析查询性能时,考虑EXPLAIN关键字同样很管用。EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作、以及MySQL成功返回结果集需要执行的行数。explain 可以帮助我们分析 select 语句,让我们知道查询效率低下的原因,从而改进我们查询,让查询优化器能够更好的工作,可以帮助选择更好的索引和写出更优化的查询语句。
星哥玩云
2022/08/17
7230
Explain 执行计划 和 SQL优化
MySQL 调试篇
本篇主讲如何使用 explain 和 explain 各个参数的意义、如何查看被优化器优化后的 SQL 和手动影响优化器的优化。
啵啵肠
2023/11/20
2660
如何定位及优化SQL语句的性能问题
在现如今的软件开发中,关系型数据库是做数据存储最重要的工具。无论是Oracale还是Mysql,都是需要通过SQL语句来和数据库进行交互的,这种交互我们通常称之为CRUD。在CRUD操作中,最最常用的也就是Read操作了。而对于不同的表结构,采用不同的SQL语句,性能上可能千差万别。本文,就基于MySql数据库,来介绍一下如何定位SQL语句的性能问题。
咸鱼学Python
2020/07/21
1.4K0
如何巧用索引优化SQL语句性能?
为什么在 MySQL数据库中,一条慢查询只要添加上合适的索引,查询速度就能提升一个档次?对于 MySQL,如何巧用索引优化SQL语句性能?需要注意什么问题?
每周聚焦
2024/05/30
2200
同一个SQL语句,为啥性能差异咋就这么大呢?
墨墨导读:本文和大家说明常见的type结果及代表的含义,并且通过同一个SQL语句的性能差异,说明建对索引多么重要。
数据和云
2019/07/22
7370
同一个SQL语句,为啥性能差异咋就这么大呢?
SQL优化 20连问
比如,存储字符串“101”,对于char(10),表示你存储的字符将占10个字节(包括7个空字符),在数据库中它是以空格占位的,而同样的varchar2(10)则只占用3个字节的长度,10只是最大值,当你存储的字符小于10时,按实际长度存储。
捡田螺的小男孩
2022/09/28
6760
【Mysql进阶-3】大量实例悟透EXPLAIN与慢查询
“你一定又写了烂SQL了!”,“你怎么这样凭空污人清白……慢查询,慢查询不能算烂……慢查询!……程序猿的事,能算烂么?” 本文从SQL执行效率方面略作研究,偏向基础性总结,但力求详实准确。如果有大佬误入此地,还请从容撤退,如果你真的愿意看,我也没什么意见。
云深i不知处
2020/09/16
1.4K0
MySQL 数据库规范--开发篇
table name = test、column1 = id、column2 = name.
用户1081422
2020/04/08
1.6K0
MySQL中的执行计划
​ 一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。
俺也想起舞
2021/10/26
9050
sql优化40秒到0.1秒的奥秘
经和运维配合查看,发现是SQL语句问题,有个sql查询脚本执行竟然消耗了40秒,我拿出来自己执行发现亦是如此。
灬沙师弟
2023/09/06
3230
sql优化40秒到0.1秒的奥秘
MySQL中SQL执行计划详解
MySQL执行计划是sql语句经过查询优化器后,查询优化器会根据用户的sql语句所包含的字段和内容数量等统计信息,选择出一个执行效率最优(MySQL系统认为最优)的执行计划,然后根据执行计划,调用存储引擎提供的接口,获取数据。
星哥玩云
2022/08/17
3.4K0
MySQL中SQL执行计划详解
mysql┃explain 都不会用?怎么优化?
现在的java开发人员越来越多,竞争也越来越激烈,moon在某钩招聘网站上发布了一个岗位需求,不到短短1天就收到20多份简历,大部分都是应届一年两年的,新鲜血液越来越多,我们也要不断的提升自己才能够不被挤下去,大家可以看下各大网站的java岗位3年以上的招聘需求:
moon聊技术
2021/07/28
6730
mysql┃explain 都不会用?怎么优化?
mysql中的查询计划及sql语句性能分析
mysql中可以使用explain这个关键字来获取(查询)sql语句的查询执行计划的。使用explain关键字,可以模拟mysql优化器执行的sql语句,从而知道mysql是如何处理sql语句的。通过explain可以分析查询语句或表结构的性能瓶颈。
IT小马哥
2022/09/23
2.2K0
mysql中的查询计划及sql语句性能分析
SQL优化中新建索引真的比Explain好?面试官:你出去吧
前几天老大问我怎么进行sql优化的,我回答了新建索引。哈哈哈,然后老大就出去找棍子了,进来之后跟我说你知道门在哪边吧,自己出去还是我请你出去?
Java程序猿阿谷
2021/01/04
5400
SQL优化中新建索引真的比Explain好?面试官:你出去吧
Java性能调优--SQL篇:优化"分页查询"
但在大数据量的情况下,分页查询是否存在效率问题?怎样分析SQL效率?如何优化分页查询效率?
浩说编程
2021/08/17
1.3K0
Java性能调优--SQL篇:优化"分页查询"
【MySQL】MySQL中SQL语句的索引分析
了解过 索引 的概念以及 B+树 的概念之后,我们就来看看怎么分析一条查询语句的索引使用情况。相信不少同学应该都使用过 EXPLAIN 来分析 SQL 语句,但是具体到 EXPLAIN 中每个字段的作用,可能有不少同学还是会有点晕的。因此,我们也是以总结为主,来简单了解一下 EXPLAIN 的具体使用。
硬核项目经理
2024/04/12
4100
【MySQL】MySQL中SQL语句的索引分析
相关推荐
【MySQL系列】- MySQL执行计划一览
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验