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

通俗解析:霍尔编码器、光电编码器、电位计、磁编码器和旋转变压器的实战选型指南 本文深入解析了霍尔编码器、光电编码器、电位计、磁编码器和旋转变压器五大主流编码器的工作原理与核心特性。通过对比精度、环境耐受性、成本及寿命等关键维度,并结合消费电子、工业自动化、汽车电子及极端环境等典型应用场景,提供了一份清晰的实战选型指南,旨在帮助工程师根据具体需求,在性能、可靠性与成本间做出最优决策。 阅读详情
小Hub领读:

用什么字段,就select什么字段,养成好习惯!


作者:陈哈哈

blog.youkuaiyun.com/qq_39390545/article/details/106766965


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

面试官:“为什么不要用 SELECT * ?它在哪些情况下效率低呢?”
陈小哈:“SELECT * 它好像比写指定列名多一次全表查询吧,还多查了一些无用的字段。”

面试官:“嗯...”
陈小哈:“emmm~ 没了”

陈小哈:“....??(几个意思)”

面试官:“嗯... 好,那你还有什么要问我的么?”
陈小哈:“我问你个锤子,把老子简历还我!”

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

废话不多说,本文带你深入了解一下 "SELECT *" 效率低的原因及场景。

本文很干!请自备茶水,没时间看记得先收藏 -- 来自一位被技术经理毒打多年的程序员的忠告

一、效率低的原因

先看一下最新《阿里 java 开发手册(泰山版)》中 MySQL 部分描述:

4 - 1. 【强制】在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。 
说明:

  • 增加查询分析器解析成本。

  • 增减字段容易与 resultMap 配置不一致。

  • 无用字段增加网络 消耗,尤其是 text 类型的字段。

开发手册中比较概括的提到了几点原因,让我们深入一些看看:

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


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

  2. 增大网络开销;* 有时会误带上如 log、IconMD5 之类的无用且大文本字段,数据传输 size 会几何增涨。如果 DB 和应用程序不在同一台机器,这种开销非常明显

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

  4. 对于无用的大字段,如 varchar、blob、text,会增加 io 操作


准确来说,长度超过 728 字节的时候,会先把超出的数据序列化到另外一个地方,因此读取这条记录会增加一次 io 操作。(MySQL InnoDB)

  1. 失去 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 的大小和命中率),这种情况下,一个是内存读,一个是磁盘读,速度差异就很显著了,几乎是数量级的差异。

二、索引知识延申

上面提到了辅助索引,在 MySQL 中辅助索引包括单列索引、联合索引(多列联合),单列索引就不再赘述了,这里提一下联合索引的作用

联合索引 (a,b,c)

联合索引 (a,b,c) 实际建立了 (a)、(a,b)、(a,b,c) 三个索引

我们可以将组合索引想成书的一级目录、二级目录、三级目录,如 index(a,b,c),相当于 a 是一级目录,b 是一级目录下的二级目录,c 是二级目录下的三级目录。要使用某一目录,必须先使用其上级目录,一级目录除外。

如下:

联合索引的优势

1) 减少开销

建一个联合索引 (a,b,c) ,实际相当于建了 (a)、(a,b)、(a,b,c) 三个索引。每多一个索引,都会增加写操作的开销和磁盘空间的开销。对于大量数据的表,使用联合索引会大大的减少开销!

2)覆盖索引

对联合索引 (a,b,c),如果有如下 sql 的,

SELECT a,b,c from table where a='xx' and b = 'xx';

那么 MySQL 可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机 io 操作。减少 io 操作,特别是随机 io 其实是 DBA 主要的优化策略。所以,在真正的实际应用中,覆盖索引是主要的提升性能的优化手段之一。

3)效率高

索引列多,通过联合索引筛选出的数据越少。比如有 1000W 条数据的表,有如下 SQL:

select col1,col2,col3 from table where col1=1 and col2=2 and col3=3;

假设:假设每个条件可以筛选出 10% 的数据。

  • A. 如果只有单列索引,那么通过该索引能筛选出 1000W10%=100w 条数据,然后再回表从 100w 条数据中找到符合 col2=2 and col3= 3 的数据,然后再排序,再分页,以此类推(递归);

  • B. 如果是(col1,col2,col3)联合索引,通过三列索引筛选出 1000w10% 10% *10%=1w,效率提升可想而知!

索引是建的越多越好吗

答案自然是否定的

  • 数据量小的表不需要建立索引,建立会增加额外的索引开销

  • 不经常引用的列不要建立索引,因为不常用,即使建立了索引也没有多大意义

  • 经常频繁更新的列不要建立索引,因为肯定会影响插入或更新的效率

  • 数据重复且分布平均的字段,因此他建立索引就没有太大的效果(例如性别字段,只有男女,不适合建立索引)

  • 数据变更需要维护索引,意味着索引越多维护成本越高。

  • 更多的索引也需要更多的存储空间

三、心得体会

相信能看到这里这老铁要么是对 MySQL 有着一腔热血的,要么就是喜欢滚鼠标的。来了就是缘分,如果从本文学到了东西,请不要吝啬手中的赞哦,拒绝白嫖~

有朋友问我,你对 SQL 规范那么上心,平时你写代码不会用 SELECT * 吧?

咋可能啊,天天用。。代码里也在用(一脸羞愧),其实我们的项目普遍很小,数据量也上不去,性能上还没有遇到瓶颈,所以比较放纵。

写本篇文章主要是这个知识点网上总结的很少很散,也不规范,算是给自己也是给大家总结一份比较详细的,值得记一下的。以后给面试官说完让他没法找你茬

顺便吹波牛 B,谢谢各位。


(完)

DPO(Direct Preference Optimization)直接偏好优化 本文介绍了DPO(直接偏好优化)方法,该方法通过简化传统的RLHF(基于人类反馈的强化学习)流程,直接利用人类偏好数据进行模型优化。DPO的核心思想是跳过奖励模型训练和强化学习交互步骤,通过数学推导将优化目标转化为仅与策略概率分布相关的形式。推导表明最优策略与奖励模型之间存在显式关系,从而可以构建直接优化策略的损失函数。与RLHF相比,DPO简化了训练流程,提高了工程实现稳定性,同时保持了同等效果。 阅读详情

相关推荐

【PADS-开发指南】

馒头破戒大师

sinat_23896491的博客 3225

select *和select 字段名

建议使用select 字段名 而少用select *。原因如下 1、SELECT*语句取出表中的所有字段,不论该字段的数据对调用的应用程序是否有用,这会对服务器资源造成浪费,甚至会对服务器的性能产生一定的影响。 2、如果表的结构在以后发生了改变,那么SELECT*语句可能会取到不正确的数据甚至是出错。 3、执行SELECT*语句时,SQLServer首先要查找出表中有哪些列,然后才能开始执行SELECT*语句,这在某些情况会产生性能问题。 4、使用SELECT*语句将不会使用到...

渣渣 1万+

ZYNQ 系统的IEEE1588 实现方法

zynq IEEE588/PTP 实现方案(讨论稿)

姚家湾博客 1万+

SQL 查询优化:为何 SELECT * 会拖慢你的数据库速度

在数据库查询中,SELECT * 语句虽然方便快捷,但却可能带来严重的性能问题。由于它会检索所有列和行数据,导致系统资源的浪费和查询效率的下降。此外,过多的数据传输也会增加网络负担,进一步影响系统性能。本文将探讨 SELECT * 带来的具体问题,并提供优化查询效率的方法。通过选择显式字段和合理使用索引,您可以显著提升数据库的性能和响应速度。

Lion_Long的博客 7671

Hypack 应用于地形测量的高级设置操作要领

Hypack 是业界公认最好的水文导航测量软件,是目前世界上应用广泛的专业测量疏浚软件。它能够接收,处理,存储和输出各种数据。Hypack支持绝大部分GPS,测深仪(国内如海鹰HY1603单波束测沙仪),多波束测深仪,旁扫声纳,涌浪补偿器,水位仪,验潮仪以及声速剖面仪。利用 Hypack 可以进行导航,单波束测量,多波束测量,旁扫测量以及疏浚实时监测等。软件界面友好,使用方便。本文简要阐述Hypack 应用于地形测量的几个重要操作要领。

中游鱼的博客 2801

普冉(PUYA)单片机开发笔记 [完结篇]:使用体会

这一篇是 PY32F003 应用实验的完结篇,总结了对这颗 MCU 的使用体会。我已经把自己实验用的代码打包上传,供各位码神参考。

Tomcat0130 - 代码生涯 9608

本章讲解 SELECT 和 SELECT * 语句。

SQL SELECT 语句 SELECT 语句用于从表中选取数据。 结果被存储在一个结果表中(称为结果集)。 SQL SELECT 语法 SELECT 列名称 FROM 表名称 以及: SELECT * FROM 表名称 注释:SQL 语句对大小写不敏感。SELECT 等效于 select。 SQL SELECT 实例 如需获取名为 “LastName” 和 “FirstName” 的列的内容(从...

cmqdcyy的博客 2445

文本→图像→视频:AIGC跨模态转换全流程解析

本文旨在系统性地解析AIGC领域中跨模态内容生成的技术原理和实现方法,特别聚焦于从文本到图像再到视频的完整转换流程。跨模态表示学习的基本原理文本到图像生成的核心技术图像到视频转换的关键算法端到端跨模态生成系统的构建方法实际应用场景和性能优化策略背景介绍:建立基本概念和知识框架核心概念:解析跨模态转换的关键技术和原理算法细节:深入讲解文本到图像、图像到视频的核心算法数学模型:提供必要的数学基础和公式推导项目实战:通过完整案例展示实现过程应用场景:探讨技术的实际应用可能性。

AI天才研究院 1355

MYSQL ——select查询

需要注意的是,尽管可以查询指定列的数据,但是这并不意味着仅查询这些列的效率一定比查询所有列的效率高。因此,在实际应用中,需要慎重考虑筛选条件和聚合函数的使用,以便获得更好的查询性能。因此,在编写 SQL 语句之前,需要对数据库结构有一定的了解,并根据具体需求来设计表结构、索引、视图等数据库对象。此外,在查询过程中还需要遵循数据库的约束条件,例如表关系、数据类型等,以保证查询结果的正确性。是非常方便的查询方式,但是并不推荐在实际应用中频繁使用,因为它可能会返回大量的数据,从而影响查询性能和网络带宽。

lsj614的博客 6132

TDS水质检测传感器原理图设计,已量产(液体传感器)

最近调试了一款针对生活用水、水培系统的 TDS 水质检测模块 —— 毕竟 TDS(总溶解固体)值直接关联水的洁净程度,是这类场景里既实用又易获取的水质指标。下面拆解下这个电路的设计逻辑,说说每个部分是怎么配合实现精准检测的。

不脱发的程序猿 1545

rk3588 适配以太网(百兆)

虽然 RK3588 的 GMAC 控制器原生支持千兆速率(10/100/1000 Mbps),但在某些工业控制、物联网网关或成本敏感型硬件设计中,开发者会选择将其配置为 百兆以太网(Fast Ethernet) 模式。

weixin_35723192的博客 222

为啥不建议使用Select * ,原因有三点

举例 :给name字段 建索引, 查询的时候,只用到了 索引的字段,这就是索引覆盖。也就是直接通过查询索引,拿出来的数据就已经满足了查询返回的字段数据。无需额外其他查询操作了,也就是索引覆盖了。这样肯定快。如果初衷是查 name, 结果写成了select *, 变成查多了其他字段, 那其他字段不是索引,肯定无法触发索引覆盖使用场景了,也就是需要额外的回表查询操作了,那这样就慢了。回归正题,因为写成select *,变成查多了其他字段, 其他字段不是索引,导致回表,慢。

qq_43842093的博客 2044

量化交易之因子分析大全

在机器学习项目中,特征工程是非常重要的。在量化研究中也是如此。本文将量化研究中常用到的特征,也就是因子进行详细收纳,并给出推导公式和实现代码。

夏之微风的博客 2284

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

无论在工作还是面试中,关于SQL中不要用“SELECT *”,都是大家听烂了的问题,虽说听烂了,但普遍理解还是在很浅的层面,并没有多少人去追根究底,探究其原理。 废话不多说,本文带你深入了解一下"SELECT * "效率低的原因及场景。 本文很干!请自备茶水,没时间看记得先收藏 -- 来自一位被技术经理毒打多年的程序员的忠告

陈哈哈的菜园子 2万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

点击上方“java大数据修炼之道”,选择“设为星标”优质文章, 第一时间送达作者:陈哈哈来源:blog.youkuaiyun.com/qq_39390545/article/details/1067...

hello world! 547

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

Java技术栈www.javastack.cn关注阅读更多优质文章版权声明:本文为优快云博主「_陈哈哈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明...

Java技术栈,分享最主流的Java技术 2371

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: 看看人家那后端API接口写得,那叫一个优雅!
下一篇: 2020,微服务降温了?
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值