select * 和 select 字段的区别
摘要:介绍 select * 和 select 字段的区别,建议各位不要使用 select * 。
在千万级表中查询数据的时候,需要千方百计提升查询效率,为用户带来最爽的体验;业界各位大佬都提到 select * 的效率会低于select字段,且推荐使用select字段。就连《阿里Java开发手册》也明确表示不得使用 select * 作为查询的字段列表,更是让这条金科玉律拥有了权威的加持。
查询效率
select * 在系统解析的时候,会多一步从系统表获取具体字段、权限、属性等相关内容的步骤,即先执行Query Table Metadata For Columns,一定程度上为数据库增加了负担。而后者无此过程。
网络带宽
结果集的数据量也会直接影响响应速度。select * 会查出所有的字段,有些是不需要的。尤其是当应用程序和服务器不在同一个局域网时,冗余字段过多,会影响网络传输的性能。这一点在查询表存在大字段的情况下愈发明显,大量数据的传输必然消耗更多网络带宽,拖慢传输速度。
结果集扩展能力
在表结构保持不变的前提下,核心结果集相同,但是select 字段的顺序可以调整,select * 则固定不变,和表结构中字段定义顺序保持一致。如果修改了表结构,select * 能够获得新表结构的所有字段;select 字段在增加字段时不会输出新字段,而且若被查询字段出现被重命名或者被删除的情况,则会报错。
应用场景
select * 效率稍低但是能应对频繁调整的表结构,适应力强,可应用于开发环境,仅极少数特殊业务场景会在生产环境使用;后者效率稍高,语义明确,更能清晰的表达业务需求,强烈推荐在生产环境中使用。
覆盖索引
在 MySQL 中,索引和数据是存在一起的,如果查询的数据和搜索条件在某个索引上就能够找到,也就是使用了覆盖索引,能够直接摒弃回表操作,减少IO次数,速度必然比去磁盘扫描快的多。如果 MySQL 和应用程序不在同一台机器,那么这种开销就会更加明显。因此,在使用 select 的时候,建议让搜索的字段和查询条件是索引上的字段信息。
连接查询时,* 无法进入缓冲池
MySQL 中连接查询的原理是先对主表(驱动表)进行查询操作,然后再用从驱动表得到的数据作为条件,逐条的到被驱动表进行查询。
每次驱动表加载一条数据到内存中,然后被驱动表所有的数据都需要往内存中加载一遍进行比较。效率很低,所以mysql中可以指定一个缓冲池的大小,缓冲池大的话可以同时加载多条驱动表的数据进行比较,放的数据条数越多性能io操作就越少,性能也就越好。所以,如果此时使用select * 放一些无用的列,只会白白的占用缓冲空间,浪费本可以提高性能的机会。
结束语
文章到这里就结束了,看完之后你有什么想法想要跟大家分享呢?评论区在等着你!
Reference
select * 和 select 字段的区别的更多相关文章
- select * 和 select 所有字段的区别
阅读本文大概需要 1 分钟. 之前发过的文章中,关于 select * 和 select 所有字段的知识,有描述不恰当,这次重新纠正下,加深下理解. MySQL 5.1.37 表记录数 41,547, ...
- mysql SELECT FOUND_ROWS()与COUNT(*)用法区别
在mysql中 FOUND_ROWS()与COUNT(*)都可以统计记录,如果都一样为什么会有两个这样的函数呢,下面我来介绍SELECT FOUND_ROWS()与COUNT(*)用法区别 SEL ...
- 关于Select * 与Select 字段名 的问题!
[转]http://blog.csdn.net/tongyu2009/article/details/8252418 1.SELECT * 语句取出表中的所有字段,不论该字段的数据对调用的应用程序是否 ...
- 子查询 做where条件 做 from的临时表 ,做select的一个字段 等
子查询 做where条件 做 from的临时表 ,做select的一个字段 等
- sql判断以逗号分隔的字符串中是否包含某个字符串--------MYSQL中利用select查询某字段中包含以逗号分隔的字符串的记录方法
sql判断以逗号分隔的字符串中是否包含某个字符串---------------https://blog.csdn.net/wttykj/article/details/78520933 MYSQL中利 ...
- select和epoll最大的区别
先说说阻塞,因为一个线程只能处理一个套接字的I/O事件,如果想同时处理多个,可以利用非阻塞忙轮询的方式,伪代码如下: while true { for i in stream[] { if i has ...
- select * 和 select 字段的速度对比
拿WordPress的数据库做一个对比 SELECT ID,post_title, post_author FROM wp_posts ORDER BY ID LIMIT 100; OK, Time: ...
- 转载-select、poll、epoll区别总结
I/O多路复用——epoll函数 select.poll.epoll区别总结 一.select.poll.epoll区别总结 1 本质上都是同步I/O 三者都是I/O复用,本质上都属于同步I/O. ...
- select * 和select 1 以及 select count(*) 和select count(1)的区别
select 1 和select * select * from 表:查询出表中所有数据,性能比较差: select 常量 from 表:查询出结果是所有记录数的常量,性能比较高: selelct 常 ...
- MySQL select 语句指定字段查询
指定字段查询 SELECT 语法 SELECT [ALL | DISTINCT] {* | table.* | [table.field1[as alias1][,table.field2[as al ...
随机推荐
- Codeforces Round 1007 (Div. 2) 比赛记录
Codeforces Round 1007 (Div. 2) 比赛记录 比赛链接 很喜欢的一场比赛,题目质量很高,不是手速场,做出题超级有成就感,赛时切掉了 A - D1,上大分了. B卡得有点久,其 ...
- Redis主从、哨兵
之前安装了redis,但是单节点redis不可靠,现在搭建redis主从,提高可用性. 一.搭建一主二从 redis主从其实是读写分离,主节点写数据,从节点读数据. 1.准备三台redis机器.red ...
- 仓储层当前有接口 IRepository<T> 抽象类 BaseRepository<T> 业务逻辑层有抽象类 BaseBusiness<M, E> 接口 IBusiness<M, E> 请用C# 给出一个案例,支持不同表对应不同的业务逻辑层,然后不同仓储实例。
以下是一个简单的C#示例,展示了如何实现不同表对应不同的业务逻辑层和不同的仓储实例: // 仓储层 public interface IRepository<T> { void Add(T ...
- pandas contains 函数
Series.str.contains( pat, # 要查询的字符串.要查询的或者正则表达式 case=True, # 是否对大小写敏感 flags=0, # 用来传给正则模块的参数,比如 flag ...
- docker部署codegeex4实现本地IDE编程助手
实现了使用docker运行的ollama作为VSC或者其他IDE的编程助手,实现本地化的AI推理 环境 debian12 docker ollama 环境配置 ollama 参考 ollama在doc ...
- 解决nvm ls-remote 列表只出现iojs版本
前言 在 nvm 安装 node 时发现显示不存在此版本,使用 nvm ls-remote 查看可安装列表时发现,列表中只有 iojs $ nvm ls-remote iojs-v1.0.0 iojs ...
- python实现排列组合--itertools
这是一个python自带的工具集,简单好用功能强大,能够大大提升编写代码效率. 功能不止排列组合,其他的用用加深理解了再整理. 官方文档:https://docs.python.org/zh-cn/3 ...
- 大模型提示词(Prompt)模板推荐
只有提示词写得好,与大模型的互动才能更高效.提示词不仅仅是与AI对话的起点,更是驱动模型产生高质量输出的关键因素.本文将介绍大模型提示词的概念.意义,并分享一些实用的提示词模板,帮助AI玩家更好地利用 ...
- Delphi 检测鼠标键盘多久没有活动
function GetInputAwayTime():DWORD; var lpi:TLastInputInfo; begin lpi.cbSize := sizeof(lpi); GetLastI ...
- Tinyhttpd 源代码初步解读
Tinyhttpd 是很早以前的一个 web 服务器程序,由 C 语言编写,整个程序十分小巧,源码只有几百行.它一般不适合用于生产环境,因为它很简单,只实现了读取 html 以及 Get / POST ...