Hi ! 我是小小,今天带来本周的第三篇。为什么大家都在说 Select * 效率低。

面试现场

面试官:“小小啊,说一说你常用的SQL优化方式吧”。

小小:“很多的,相当多,比如不要用SELECT,查询效率低,巴拉巴拉。。。”

面试官:“为什么不要用 SELECT* ?它在那些情况下效率低呢?”

小小:“SELECT *  它好像比写指定列多一次全表查询吧,还多查了一些无用的字段。”

面试官:“嗯?”

小小:“emememem~ 没了”

小小:“...??????”

面试官:“嗯,你还有什么药问的”

小小:“没了,我问你个锤子,赶紧把简历给我”

下面开始进入正题,

不需要的列会增加数据传输时间和网络开销

用SELECT * 数据库需要解析更多的对象,字段,权限,属性等等相关内容,在SQL语句复杂,硬解析较多的情况下,会对数据库造成沉重的负担。

增大网络开销,* 有时会误操作,带上log,icomMD%等之类的无用且大的文本字段,数据传输size会几何的增长,如果DB和应用程序不在同一台机器,这种开销相当的明显

即使 Mysql 服务器和客户端在同一台机器上,使用的协议还是 tcp,通信也需要额外的时间。

对无用的大字段,例如varchar,blob,text会增加io操作

正确来说,长度操作728字节的时候,会先把超出的数据序列化到另外一个地方,因此肚脐去的时候,这条记录会增加一次io操作。

失去Mysql优化器,覆盖索引优化措施的可能性

SELECT * 杜绝了覆盖索引的可能性,而基于 MySQL 优化器的“覆盖索引”策略又是速度极快,效率极高,业界极为推荐的查询优化方式。

例如,有一个表为 t(a,b,c,d,e,f),其中,a 为主键,b 列有索引。

那么,在磁盘上有两棵 B+ 树,即聚集索引和辅助索引(包括单列索引、联合索引),分别保存(a,b,c,d,e,f)和(a,b)。

如果查询条件中 where 条件可以通过 b 列的索引过滤掉一部分记录,查询就会先走辅助索引;如果用户只需要 a 列和 b 列的数据,直接通过辅助索引就可以知道用户查询的数据。

如果用户使用 SELECT *,获取了不需要的数据,则首先通过辅助索引过滤数据,然后再通过聚集索引获取所有的列,这就多了一次 B+ 树查询,速度必然会慢很多。

由于辅助索引的数据比聚集索引少很多,很多情况下,通过辅助索引进行覆盖索引(通过索引就能获取用户需要的所有列),都不需要读磁盘,直接从内存取。

而聚集索引很可能数据在磁盘(外存)中(取决于 buffer pool 的大小和命中率),这种情况下,一个是内存读,一个是磁盘读,速度差异就很显著了,几乎是数量级的差异。

后期维护

使用 SELECT * 时候,不熟悉代码库的人将会被迫查询文档,以了解能够进行有效更改之前需要返回那些列,从长远来看,使得代码更不具有可读性,从而耗费了更多的时间和精力。

如果代码取决于列顺序,SELECT * 则如果表的列顺序已经更改,则会隐藏等待发生的错误。

使用时配置更加复杂化。

设计模式

select * 是反设计模式。

查询的目的不太明显,应用程序使用的列是不透明的,打破的列的模块化设计。

关于作者

我是小小,一个生于二线,活在一线的程序猿,我是小小,我们下期再见。

小明菜市场

推荐阅读

● k8s | 搞不明白为什么大家都在学习 k8s

● 对战 | RabbitMq 大战 kafka

● 执行流程 | 你真的了解Spring AOP的执行顺序吗?

● 吊打面试官 | Java到底是值传递还是引用传递

● 容器 | Docker 如此之好,你为什么还要用k8s

给我个好看再走好吗?

MySql | 为什么大家都在说 Select * 效率低相关推荐

  1. 为什么大家都说 SELECT * 效率低?

    版权声明:本文为CSDN博主「_陈哈哈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/qq_39390545/ ...

  2. nbear分页 效率低_为什么大家都说“SELECT *”效率低?

    " 无论在工作还是面试中,关于 SQL 中不要用"SELECT *",都是大家听烂了的问题,虽说听烂了,但普遍理解还是在很浅的层面,并没有多少人去追根究底,探究其原理. ...

  3. 面试了3家公司,都问我:为什么大家都说 SELECT * 效率低?

    相关阅读:一个90后员工猝死的全过程 来源:blog.csdn.net/qq_39390545/article/details/106766965 面试官:"小陈,说一下你常用的SQL优化方 ...

  4. 为什么大家都说SELECT * 效率低 ?

    面试官:"小陈,说一下你常用的SQL优化方式吧." 陈小哈:"那很多啊,比如不要用SELECT *,查询效率低.巴拉巴拉..." 面试官:"为什么不要 ...

  5. 大家都说 Java 反射效率低,为什么呢?

    我们在 Java 开发中,难免会接触到反射,而在一些框架中,反射的运用更是常见.我相信,每次提到反射,大家的第一反应一定是反射效率低,尽量少使用.但是反射的效率到底低多少?反射效率低的原因在哪里?这篇 ...

  6. 大家都说 Java 反射效率低,你知道原因在哪里么

    [这是 ZY 第 17 篇原创技术文章] 预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低的原因 文章概览 我们在 Java 开发中, ...

  7. mysql越筛越少_面试官:为什么SELECT * 会导致查询效率低?

    面试官:"小陈,说一下你常用的SQL优化方式吧." 陈小哈:"那很多啊,比如不要用SELECT *,查询效率低.巴拉巴拉..." 面试官:"为什么不要 ...

  8. 同一目录下有大量文件会影响效率吗_到底是什么原因才导致 select * 效率低下的?

    面试官:"小陈,说一下你常用的SQL优化方式吧." 陈小哈:"那很多啊,比如不要用SELECT *,查询效率低.巴拉巴拉..." 面试官:"为什么不要 ...

  9. 到底是什么原因才导致 select * 效率低下的?

    面试官:"小陈,说一下你常用的SQL优化方式吧." 陈小哈:"那很多啊,比如不要用SELECT *,查询效率低.巴拉巴拉..." 面试官:"为什么不要 ...

最新文章

  1. css3实现烟花效果,CSS3 带颤动效果的简易烟花动效
  2. 陕西师范大学第七届程序设计竞赛 C题 iko和她的糖
  3. 【Java线程】线程池的原理和实现
  4. 解决redis启动时的警告
  5. 三维ICP-SVD配准
  6. 求101-200以内的素数
  7. win10设置pg/pc接口_旧电脑升级!使用固态硬盘必做的5件事,让win10操作流畅如win7...
  8. python基础编程语法-Python基础及语法(十三)
  9. 三、函数的嵌套、作用域链、函数名的应用、闭包。
  10. Xeogl 基于 WebGL 的 3D 引擎
  11. 使用ESP8266模块在WIFI下通过网页远程控制LED开关
  12. Matlab-香农编码
  13. python与数据思维基础笔记第一章_python学习笔记-第1章节 基础知识
  14. python编程题13-蒙特·卡罗方法计算圆周率
  15. 安装tensorflow报错:Cannot uninstall ‘wrapt‘. It is a distutils installed project and thus we cannot accu
  16. Nothing Phone官宣,手机厂新秀靠啥出圈?
  17. 计算机与投影仪的记录,投影仪和电脑的连接及PPT播放
  18. 微信营销辅助工具能够帮助我们解锁哪些新功能?
  19. Android自定义的下拉列表框控件
  20. iPhone 隐藏了App 如何恢复

热门文章

  1. C#调用C和C++函数的一点区别
  2. 【小工匠聊Modbus】04-调试工具
  3. 如何部署和搭建测试log4j 2
  4. html相对位置置顶,css定位(position)属性怎么用?
  5. 如何优雅地本地化构建Mybatis源码
  6. 文件系统c语言程序,C语言程序设计(第8章 输入输出和文件系统)01
  7. 什么?你竟然还没有用这几个chrome插件? 1
  8. STM32L0 读取芯片温度与当前供电电压 STM32L051C8T6
  9. 深度学习基础(常见的网络2)
  10. 为什么成员属性不会被重写