SQL优化实战-0002:select查询不建议使用星号(select *),最好指定具体查询字段

news/2024/10/22 17:20:00/

image-20230106010814789

文章目录

  • 1.查询时的普遍写法
  • 2.问题分析
    • 2.1 计算负担
    • 2.2 IO负担
    • 2.3 覆盖索引失效
    • 2.4 缓存压力
  • 3.总结

1.查询时的普遍写法

select *
from the_table_name
where ...

2.问题分析

2.1 计算负担

数据库需要去解析更多的对象字段、权限、属性,查询数据字典将"*"按序转换成所有列名。那么在SQL语句复杂,硬解析比较多的情况下,会给数据库增加计算负担。

2.2 IO负担

星号意味着查询所有的字段,我们都知道MySQL数据库的数据都是存储在磁盘上的,那么将全部字段数据从磁盘读取到内存的磁盘IO开销比较大,特别是某些字段占的存储空间还比较大时,比如说 text,blob 这种类型的字段,压力会更大。同时应用服务器(Java端)从数据库服务器通过网络传输获取数据的开销也会比较大,占用更多网络带宽,造成网络延迟。

2.3 覆盖索引失效

select * 会失去覆盖索引的可能性,回表操作造成了索引效率发挥不出来。

简单解释下为什么覆盖索引失效:

比如 t_user 表中有 idnameage 三个字段,我们在 id 上建立了主键索引,在 name 上建立了普通索引,那么就存在了两棵B+树,此时我们只需要 如果我们只需要根据 name 查询到 id 和 name 两个字段的信息。

如果使用 select * 的写法:

select * from t_user
where name = ?

那么首先会从磁盘中将 name 建立的辅助索引读取到内存,查到了符合的 name 后,由于select * 因此还要查询 age ,就会根据符合的 name 进行一次或多次回表操作。

但如果使用的是明确指明字段的方式:

select `id`,name from t_user
where name = ?

那么从辅助索引中查到了符合的 name 后,就不需要回表操作去查询无用的age,而 id 身为主键自然在辅助索引中保存了与 name 对应的信息。

2.4 缓存压力

如果需要将某些热点数据进行缓存(比如在redis中缓存),如果不在缓存时做更多剔除不必要字段信息的处理,那么对查询到的所有字段数据进行缓存到内存中,会导致内存也消耗更快。

3.总结

在阿里巴巴的规范中,有两点要求:

  1. 严禁使用 select * 进行查询
  2. 尽可能返回少的字段,即不要查询用不到的字段

对于这两个规范,包括上述提到的问题分析,其实对于我们大多数人的实际开发中会发现对性能的影响不会很大,甚至是可以忽略不计,我认为有两点原因:

  • 大多数人不会在阿里巴巴之类的大厂,也就没有特别大的用户量,并发低、数据库存储压力小,自然对服务器性能影响不会很大,也不必在乎select * 带来的这一点小的影响。
  • 即使是查询全部字段,也不会占很大IO开销,因为对于大的类型字段,我们通常会选择垂直分表操作,把这些大的字段信息单独放到其他表中存储。

因此,相比于阿里巴巴的严禁使用,在这里想说的是:

在表查询中,建议明确字段,不要使用 * 作为查询的字段列表,推荐使用SELECT <字段列表> 查询,并且不去查询用不到的字段。

但我们还是需要知道为什么阿里巴巴有这样的规范,即上述的问题分析,因为真实面试可能会问到,同时呢,在有DBA的公司中也通常会要求开发工程师不要去使用 select *。😫


http://www.ppmy.cn/news/10240.html

相关文章

风险事件标签识别之BiLSTM实现的代码+数据

项目介绍:   数据集:风险事件分类的训练集规模是10000+,包含10个一级标签和35个二级标签;大规模无标注的文本规模是亿级,可供选手选择用来进行语言模型训练。数据性质均为新闻资讯数据,并且进行了字符编码(保留了句子划分的标点符号),文中的字符会转换成唯一的ID,I…

哪些程序员适合自由工作?(附平台推荐)

在早些时候进行远程办公&#xff0c;接私活或者跨国进行编程&#xff0c;赚点外快等也不是什么奇怪的事情。但是那时候没有人想到会把这些工作完全变成自己的主要业务——也就是我们说的自由工作。也不知道是哪一个第1个吃了螃蟹的人发现自由工作还不错&#xff0c;于是经过后面…

WebLogic-执行队列

一&#xff0c;Tuning the Application Server 二&#xff0c;执行队列 Using Work Managers to Optimize Scheduled WorkThis chapter describes how WebLogic Server 12.1.3 lets you configure how your application prioritizes the execution of its work using a Work Ma…

【博学谷学习记录超强总结,用心分享|产品经理基础总结和感悟13】

这里写目录标题第一章、概述第二章&#xff0c;内容服务产品分析框架&#xff1a;用户-平台-创作者内容服务平台优化思考第一章、概述 在分析文字类内容产品之前&#xff0c;我们先来思考一下内容产品的本质是什么&#xff1f;笔者认为&#xff0c;所有满足用户需求的信息服务…

创建Vue3项目以及引入Element-Plus

创建Vue3项目以及引入Element-Plus 前提条件&#xff1a;本地需要有node环境以及安装了npm&#xff0c;最好设置了镜像&#xff0c;这样下载包的时候会快些。 1、安装vue脚手架vue-cli3 npm install vue/cli -g2、安装后查看vue的版本 vue -V3、创建Vue项目&#xff0c;项目…

(十三)JAVA基础语法

目录 前言: 一、包 二、权限修饰符 三、final关键字 四、常量 五、枚举 六、抽象类 七、抽象类:模板方法模式 八、接口 前言: ①包: 在编写Java程序时&#xff0c;随着程序架构越来越大&#xff0c;类的个数也越来越多&#xff0c;这时就会发现管理程序中维护类名称也…

(1分钟了解)SLAM的七大问题:地图表示、信息感知、数据关联、定位与构图、回环检测、深度、绑架

编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;SLAM问题也被称为是CML问题。编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&…

React 学习笔记总结(六)

文章目录1. redux 介绍2. redux 工作流程3. redux 的使用4. redux 完整结构补充5. redux的 异步action6. react-redux库 与 redux库7. react-redux库的 实战8. react-redux的connect 最精简写法9. react-redux的 Provider组件作用10. react-redux 整合UI组件 和 容器组件11. re…