摘要:介绍 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 字段的区别的更多相关文章

  1. select * 和 select 所有字段的区别

    阅读本文大概需要 1 分钟. 之前发过的文章中,关于 select * 和 select 所有字段的知识,有描述不恰当,这次重新纠正下,加深下理解. MySQL 5.1.37 表记录数 41,547, ...

  2. mysql SELECT FOUND_ROWS()与COUNT(*)用法区别

    在mysql中 FOUND_ROWS()与COUNT(*)都可以统计记录,如果都一样为什么会有两个这样的函数呢,下面我来介绍SELECT FOUND_ROWS()与COUNT(*)用法区别   SEL ...

  3. 关于Select * 与Select 字段名 的问题!

    [转]http://blog.csdn.net/tongyu2009/article/details/8252418 1.SELECT * 语句取出表中的所有字段,不论该字段的数据对调用的应用程序是否 ...

  4. 子查询 做where条件 做 from的临时表 ,做select的一个字段 等

    子查询 做where条件 做 from的临时表 ,做select的一个字段 等

  5. sql判断以逗号分隔的字符串中是否包含某个字符串--------MYSQL中利用select查询某字段中包含以逗号分隔的字符串的记录方法

    sql判断以逗号分隔的字符串中是否包含某个字符串---------------https://blog.csdn.net/wttykj/article/details/78520933 MYSQL中利 ...

  6. select和epoll最大的区别

    先说说阻塞,因为一个线程只能处理一个套接字的I/O事件,如果想同时处理多个,可以利用非阻塞忙轮询的方式,伪代码如下: while true { for i in stream[] { if i has ...

  7. select * 和 select 字段的速度对比

    拿WordPress的数据库做一个对比 SELECT ID,post_title, post_author FROM wp_posts ORDER BY ID LIMIT 100; OK, Time: ...

  8. 转载-select、poll、epoll区别总结

    I/O多路复用——epoll函数 select.poll.epoll区别总结 一.select.poll.epoll区别总结   1 本质上都是同步I/O 三者都是I/O复用,本质上都属于同步I/O. ...

  9. select * 和select 1 以及 select count(*) 和select count(1)的区别

    select 1 和select * select * from 表:查询出表中所有数据,性能比较差: select 常量 from 表:查询出结果是所有记录数的常量,性能比较高: selelct 常 ...

  10. MySQL select 语句指定字段查询

    指定字段查询 SELECT 语法 SELECT [ALL | DISTINCT] {* | table.* | [table.field1[as alias1][,table.field2[as al ...

随机推荐

  1. windows mysql8安装zip

    MySQL 是一种广泛使用的关系数据库管理系统,MySQL 8 是其最新的主要版本,结合了出色的性能和丰富的功能. 一.准备工作 1. 下载MySQL 8 zip包 首先,你需要获取MySQL 8的压 ...

  2. ChatBI≠NL2SQL:关于问数,聊聊我踩过的坑和一点感悟

    "如果说数据是新时代的石油,智能问数就是能让普通人也能操作的智能钻井平台." 这里是**AI粉嫩特攻队!** ,这段时间真的太忙了,不过放心,关于从零打造AI工具的coze实操下篇 ...

  3. 痞子衡嵌入式:了解主从系统中i.MXRT系列MCU从主处理器接收App数据包超时机制

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是主从系统中i.MXRT系列MCU从主处理器接收App数据包超时机制. 在痞子衡旧文 <RT四位数Boot模式> 里的 1.2 ...

  4. 探秘Transformer系列之(13)--- FFN

    探秘Transformer系列之(13)--- FFN 目录 探秘Transformer系列之(13)--- FFN 0x00 概述 0x01 网络结构 1.1 数学表示 1.2 中间层比率 1.3 ...

  5. Vite项目入口文件

    官方文档:https://cn.vitejs.dev/guide/#index-html-and-project-root

  6. 视觉SLAM第四讲李群与李代数习题

    视觉SLAM第四讲李群与李代数习题 一.验证\(SO(3).SE(3).SIM(3)\)关于乘法成群 首先引入一下群的定义. 群 (Group) 是一种集合加上一种运算的代数结构.我们把集合记作 \( ...

  7. Visual Studio 2017 导出 ASP.NET Core 项目模版项目文件为空

    问题重现 VS 2017 针对 ASP.NET Core 导出模版功能有问题 解决办法 visual-studio-2017-templates-and-the-missing-content 目前官 ...

  8. 判断属性值,选择性执行下一步(get element attribute指令的用法)

    应用场景: 下图线下支付,在退款前需要勾选这种支付方式,否则无法实现支付. 如果在测试脚本内即加入勾选指令,那么在下次执行的时候就会再次勾选,从而造成去除勾选的操作 对比一下勾选前后,勾选框元素内容组 ...

  9. FastAPI数据库集成与事务管理

    title: FastAPI数据库集成与事务管理 date: 2025/04/18 00:15:34 updated: 2025/04/18 00:15:34 author: cmdragon exc ...

  10. Python3多线程

    一.进程和线程 进程:是程序的一次执行,每个进程都有自己的地址空间.内存.数据栈及其他记录运行轨迹的辅助数据. 线程:所有的线程都运行在同一个进程当中,共享相同的运行环境.线程有开始.顺序执行和结束三 ...