为什么不建议使用SELECT * ?

news2024/9/25 11:20:04

“不要使用SELECT ”几乎已经成为数据库使用的一条金科玉律,就连很多公司也明确表示不得使用作为查询的字段列表,更是让这条规则拥有了权威的加持。

在这里插入图片描述
为什么不建议直接使用SELECT *?我们总得搞清楚这其中的原因吧,不要别人说不建议使用,我们就不使用,总得有自己的思考的。

增加磁盘开销

数据库本质上是将记录存储在磁盘上,查询操作就是一种进行磁盘IO的行为(要查询的记录在缓存中是没有的)。

我们查询的字段越多,读取的内容也就越多,对IO磁盘的开销也就会增大,特别是某些字段,如TEXT、MEDIUMTEXT或者BLOB等类型,磁盘IO开销增加会更加明显。

加重网络时延

数据每次都通过socket send buffer发送到客户端,查询一次数据量不大,如果一旦有人使用*将TEXT、MEDIUMTEXT或者BLOB 类型查出来,数据量会成指数级上升,网络传输的次数会增加,时间也就会增加。

无法使用覆盖索引

CREATE TABLE `user_innodb` 
( `id` int NOT NULL AUTO_INCREMENT, 
`name` varchar(255) DEFAULT NULL,
`gender` tinyint(1) DEFAULT NULL, 
`phone` varchar(11) DEFAULT NULL, PRIMARY KEY (`id`), 
KEY `IDX_NAME_PHONE` (`name`,`phone`) 
USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

上面我们通过创建一个表,存储引擎为InnoDB的表user_innodb,并设置id为主键,另外为name和phone创建了联合索引,同时向表中随机初始化800多万条数据。

InnoDB会自动为主键id创建一棵名为主键索引(又叫做聚簇索引)的B+树,这个B+树的特点就是叶子节点包含了完整的用户记录,B+树创建如下所示:
在这里插入图片描述
如果我们执行这种SQL语句:

SELECT * FROM user_innodb WHERE name = '将瑶';

上面的SQL语句会使用到IDX_NAME_PHONE索引,为一个二级索引。二级索引的叶子节点如下所示:
在这里插入图片描述
InnoDB存储引擎会根据搜索条件,在二级索引的叶子节点中找到name为将瑶的记录,但是二级索引中只记录了name、phone和主键id字段(因为我们用的是SELECT *,所以会全部查出来),因此InnoDB需要拿着主键id去主键索引中查找这一条完整的记录,因此这个过程叫做回表。

JOIN连接查询可能变慢

CREATE TABLE `t1` (
  `id` int NOT NULL,
  `m` int DEFAULT NULL,
  `n` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT;

CREATE TABLE `t2` (
  `id` int NOT NULL,
  `m` int DEFAULT NULL,
  `n` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT;

我们执行下面这条SQL语句:

SELECT * FROM t1 STRAIGHT_JOIN t2 ON t1.m = t2.m;

为了使结果更加明显,使用STRAIGHT_JOIN强制令t1表作为驱动表,t2表作为被驱动表。

因为在连接查询中,驱动表只会被访问一次,而被驱动表多次被访问,具体的访问次数决定于驱动表中符合查询记录的条数。由于强制确定了驱动表和被驱动表,下面讲解一下这两个表的连接本质:

t1作为驱动表,针对驱动表的过滤条件,执行对t1表的查询。因为没有过滤条件,也就是获取t1表的所有数据;

对上一步中获取到的结果集中的每一条记录,都分别到被驱动表中,根据连接过滤条件查找匹配记录。

如果用伪代码表示上述查询,代码如下:

// t1Res是针对驱动表t1过滤之后的结果集
for (t1Row : t1Res){
  // t2是完整的被驱动表
  for(t2Row : t2){
  	if (满足join条件 && 满足t2的过滤条件){
      发送给客户端
    }  
  }
}

这种方法最简单,也是最容易想到,但同时性能也是最差,这种方式被称为嵌套循环连接(Nested-LoopJoin,NLJ)。

怎样使连接速度才能变快呢?

其中一个方法是创建索引,最好是在被驱动表(t2)连接条件涉及到的字段上创建索引,因为被驱动表需要被查询多次,对被驱动表的访问本质上就是个单表查询(因为t1结果集已确定,每次连接t2的查询条件也就已确定)。

既然使用了索引,为了避免无法使用覆盖索引,我们最好也不要直接SELECT *,而是将真正用到的字段作为查询列,并为其建立适当的索引。

所以再次提醒,最好不要把*作为查询列表,只要把需要的列放到查询列表就可以了,这样可以减少分批的次数,也就减少了对被驱动表的访问次数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1074477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3 组件v-model绑定props里的值,修改组件的值要触发回调

很早之前就写了&#xff0c;一直没写篇博客记录下 <select v-model"typeVal" />const emit defineEmits([update:type]); const props defineProps({type: { type: String, default: }, });const typeVal computed({get() {return props.type;},set(value…

Flutter:open_file打开本地文件报错问题

相关插件及版本&#xff1a; open_file: ^3.2.1 问题&#xff1a; 项目中一直用的这个插件&#xff0c;突然发现在安卓高版本不能正常使用&#xff0c;报权限问题permissionDenied&#xff0c;断点调试提示相关权限是MANAGE_EXTERNAL_STORAGE&#xff0c;申请权限之后还是不行&…

PDF有限制不能复制怎么办?

大家现在接触PDF文件越来越多&#xff0c;有的时候在网上下载的PDF文件打开之后&#xff0c;发现选中文字之后无法复制。甚至其他功能也都无法使用&#xff0c;这是怎么回事&#xff1f;该怎么办&#xff1f; 当我们发现文件打开之后&#xff0c;编辑功能无法使用&#xff0c;很…

探索视觉系统工作原理,聚焦机器人应用“新视界”

原创 | 文 BFT机器人 01 视觉系统&#xff1a;机器人的“眼睛” 视觉系统是一个非常复杂的系统&#xff0c;包括照明系统、镜头、摄像系统和图像处理系统。机器视觉系统主要由三部分组成&#xff1a;图像的获取、图像的处理和分析、输出或显示。 从功能上看&#xff0c;典型的…

Allegro批量剪断走线操作

在用Allegro设计 PCB过程中,有时候由于原理图改动,导致布局的改动。这就会导致走完的线要重新走,对于差分对因为前半部分的走线是不用重新走的。那就可以使用剪断后面部分的线,然后删除,提高走线的效率。那如何批量剪断走线呢? (1)选择菜单Manufacture→Drafting→Dele…

ROS2学习(六)Bag回放使用plotjugger

Plotjugger Plotjugger是一个类似rqt_plot的可视化工具&#xff0c;但PlotJuggler拥有更强大和好用的功能。你可以导入文本文件让它显示文本文件中的数据&#xff0c;可以导入csv等各种格式的文件&#xff0c;支持画出数据曲线2. Bag回放 使用Plotjugger 可以导入ros的bag包…

docker pull 拉取镜像报错

报错信息&#xff1a;Error response from daemon: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit 简单理解就是拉取镜像失败&#xff0c;外部原因&…

HDLbits: Lfsr5

我的错误写法&#xff0c;半成品&#xff0c;完全错误&#xff1a; module top_module(input clk,input reset, // Active-high synchronous reset to 5h1output [4:0] q ); dff dff_1(clk, 0 ^ q[0],q[4]);dff dff_2(clk, q[4] ,q[3]);dff dff_3(clk, q[3] ^ q[0] ,q[2]);…

2023年中国棋牌桌市场规模及行业前景:更具创意和功能是未来趋势[图]

棋牌桌行业是指涉及棋牌类游戏的桌面制造、销售和相关服务的产业&#xff0c;它包括生产和销售各种类型的棋牌桌&#xff0c;如象棋桌、扑克桌、麻将桌等&#xff0c;以及提供与这些游戏相关的配件和设备。 棋牌桌行业分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网…

Android多线程学习:多线程同步

一、多线程 多线程就是指一个进程中同时有多个线程正在执行。 二、多线程优缺点&#xff1a; 优点&#xff1a; 1、提高程序运行效率&#xff0c;如同时上传多个图片&#xff1b; 2、耗时操作放子线程执行&#xff0c;提高主线程执行效率&#xff0c;无需等待。 缺点&#…

【Spring MVC研究】聊聊web绑定器(WebDataBinder、@InitBinder)

文章目录 1. 绑定器的作用2. 使用方式&#xff08;测试代码&#xff09;InitBinder3. 相关的几个核心类的真实类型4. 原理4.1. 正向推理4.2. 反向推理4.3. 正向反向推理结合分析4.4. 重点来了&#xff08;如果前后衔接是接4.3章节&#xff09;4.4.1. InitBinder注解的注册4.4.2…

vue学习-12路由组件的基本使用

vue的路由是vue,js官方的路由管理器&#xff0c;其主要用于构建单页应用程序&#xff0c;允许你通过定义路由来管理不同页面之间的导航。 1.引入路由 在使用vue的路由之前&#xff0c;一般我们在创建vue项目的时候&#xff0c;是可以选择添加路由的&#xff0c;只要你选择了y…

antd树型表格的逐级展开折叠(每次展开都只展开到当前未展开的最小层级,每次折叠都只折叠到当前未折叠的最大层级)

需求有些变态&#xff0c;我们用一段话和一张图来演示下 效果如下&#xff1a; 如遇到每级展开层级不一致的&#xff0c;如【2级2】展开到第3级&#xff0c;那此时点击展开&#xff0c;所有已展开的不动&#xff0c;将未展开到第3级的其他元素全部展开到第3级 效果如下&…

东土科技与诺贝尔物理学奖2006年度得主斯穆特签约,加快布局工业AI

近日&#xff0c;诺贝尔物理学奖2006年度得主乔治.斯穆特教授与东土科技正式签约&#xff0c;成为东土科技工业人工智能顾问。 乔治斯穆特&#xff08;George Fitzgerald Smoot&#xff09;教授也曾获得爱因斯坦奖&#xff0c;在宇宙学、大数据、生物医学诊断仪器以及人工智能…

第一章:随机过程预备知识

第一章&#xff1a;随机过程预备知识 随机过程属于概率论的分支学科。概率论注重结果&#xff1a;上涨的概率&#xff0c;下跌的概率。随机过程注重过程&#xff0c;随着时间的推移&#xff0c;结果的演化过程。 1.1 随机事件与概率的定义 事件的本质是集合&#xff0c;有关集…

workerman的基本用法(示例详解)

workerman是什么&#xff1f; Workerman是一个异步事件驱动的PHP框架&#xff0c;具有高性能&#xff0c;可轻松构建快速&#xff0c;可扩展的网络应用程序。支持HTTP&#xff0c;Websocket&#xff0c;SSL和其他自定义协议。支持libevent&#xff0c;HHVM&#xff0c;ReactPH…

朋友一口气拿下字节27K的offer,实名羡慕了....

最近有朋友去字节面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

DRM全解析 —— framebuffer详解(1)

本文参考以下博文&#xff1a; Linux内核4.14版本——drm框架分析(1)——drm简介 特此致谢&#xff01; 1. 简介 framebuffer是一块内存区域&#xff0c;可以理解为一块画布&#xff0c;驱动和应用层都能访问它。绘制前需要将它格式化&#xff0c;设定绘制的色彩模式&#x…

leetcode:217. 存在重复元素(python3解法)

难度&#xff1a;简单 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true &#xff1b;如果数组中每个元素互不相同&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,1] 输出&#xff1a;true 示例 2&#xff1a; 输…

DruidDataSource导致OOM问题处理

DruidDataSource导致OOM问题处理 起因分析日志分析Dump文件问题分析处理 起因 一个平凡的工作日&#xff0c;我像往常一样完成产品提出的需求的业务代码&#xff0c;突然收到了监控平台发出的告警信息。本以为又是一些业务上的 bug 导致的报错&#xff0c;一看报错发现日志写着…