面试官又问我Select * 为什么效率低下?
Select * 为什么效率低下
无论是在平时的工作中还是面试中,都会遇到不让用Select *的情况,那么到底是什么原因导致其沦落到人人喊打的地步呢/
效率低下的原因
在阿里java开发手册中关于Mysql的部分描述中提到:在表查询中一律不要使用* 作为查询的字段列表,需要用那些字段必须明确写明。原因如下:
增加查询分析器解析的成本
增减字符容易与resultMap配置不一致
无用字段增加网络消耗,尤其是test类型的字段
那么接下来我们就逐条深入的分析一下
不需要的列会增加数据传输时间和网络开销
- 用“select * ”数据库需要解析更多的对象、字段、权限、属性等相关内容,在sql语句复杂,硬解析比较多的情况下,会对数据库造成沉重的负担
- 增大网络开销,* 有时会误带上诸如log、IconMD5之类无用且大文本字段,数据传输size会呈现几何增长,如果DB和应用程序不在同一台机器上。这种开销会十分明显
- 即使mysql服务器和客户端在同一机器上,使用的协议还是tcp,通信也是需要额外的时间的
对于无用的大字段,如varchar、blob、text,会增加io操作
准确的来说,长度超过728字节的时候,会把超出的数据序列化到另外一个地方,因此读取这条记录会增加一次io操作。(mysql innodb)
失去mysql优化器“覆盖索引”策略优化的可能性
select * 杜绝了覆盖索引的可能性,而基于Mysql优化器的“覆盖索引”策略又是速度极快,效率极高、业界极为推荐的查询优化方式
联合索引
联合索引(a,b,c)实际上是建立了(a)、(a,b)、(a,b,c)三个索引
联合索引的优势
减少开销
建一个联合索引,相当于建立三个索引。由于每多一个索引,都会增加写操作的开销和磁盘空间的开销。对于大量数据的表,使用联合索引会大大减少开销。
覆盖索引
MySQL 可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机 io 操作。减少 io 操作,特别是随机 io 其实是 DBA 主要的优化策略。所以,在真正的实际应用中,覆盖索引是主要的提升性能的优化手段之一。
效率高
索引是建的越多越好吗
- 数据量小的表不需要建立索引,建立会增加额外的开销
- 不经常引用的列不需要建立索引,因为不经常使用,及时建立了索引也没多大意义
- 经常频繁更新的列不要建立索引,因为肯定会影响插入或更新的效率
- 数据重复且分布平均的字段,因此他建立索引就没有太大的效果(例如性别字段,只有男女,不适合建立索引)
- 数据变更需要维护索引,意味着索引越多维护成本越高。
- 更多的索引也需要更多的存储空间
面试官又问我Select * 为什么效率低下?相关推荐
- 面试官都会问的Mybatis面试题,你会这样回答吗?
一.概述 面试,难还是不难?取决于面试者的底蕴(气场+技能).心态和认知及沟通技巧.面试其实可以理解为一场聊天和谈判,在这过程中有心理.思想上的碰撞和博弈.其实你只需要搞清楚一个逻辑:"面试 ...
- 华为二面!!!面试官直接问我Java中到底什么是NIO?这不是直接送分题???
华为二面!!!面试官直接问我Java中到底什么是NIO?这不是直接送分题??? 什么是NIO 缓冲区(Buffer) 缓冲区类型 获取缓冲区 核心属性 核心方法 非直接缓冲区和直接缓冲区 非直接缓冲区 ...
- 二面京东,面试官直接问我JVM,我心里一阵暗爽~
二面京东,面试官直接问我JVM,我心里一阵暗爽~简直了,hhhh 明人不说暗话,直接进入主题!!! 一.什么是JVM 二.JAVA代码编译和执行过程 类加载机制 类执行机制 三.JVM内存管理和垃圾回 ...
- 面试官常问的 web前端 问题(二)
面试官常问的 web前端 问题 11-20 11.什么是响应式设计? 12.为什么我们要弃用 table 标签 13.iframe 有哪些缺点 14.meta viewport 是做什么用的,怎么写? ...
- 【建议收藏】面试官会问的位运算奇淫技巧
往期热门文章: 1.到底可不可以用 kill -9 关闭程序?2.IDEA 2021首个大版本发布,新增了这几个超实用功能!3.Optional 是个好东西,你真的会用么?4.Java 8 Concu ...
- 之前遇到一位老面试官,问我的问题真的有点东西
这篇文章其实源于一次我的面试经历. 那次我面对是一位老面试官,真的很有东西. 那次面试我和他叨叨了两小时....我滴妈我嘴巴都干了真的. 他的提问都很有深度,可以说对我的学习之路有很大的帮助. 我记得 ...
- 面试官再问我如何保证 RocketMQ 不丢失消息,这回我笑了!
0x00. 消息的发送流程 一条消息从生产到被消费,将会经历三个阶段: 生产阶段,Producer 新建消息,然后通过网络将消息投递给 MQ Broker 存储阶段,消息将会存储在 Broker 端磁 ...
- 99%的面试官都会问到的Java面试题
转载自 99%的面试官都会问到的Java面试题 最近是招聘季,所谓金九银十,正是跳槽的好几节.今天,给大家整理了一些Java面试常考的经典题目,我们一道一道来分析一下. 经典面试题 1.谈谈你对 J ...
- 平面设计面试官常问的问题有哪些?
平面设计面试官常问的问题有哪些?一般情况下都会有一个开篇的自我介绍,这里建议就用平常聊天说话的语气语速来介绍就可以,介绍自己扬长避短,多讲自己的前工作项目经验,在校获奖也可以讲.与工作岗位不强相关 ...
- 字节跳动面试官这样问消息队列:高可用、不重复消费、可靠传输、顺序消费、消息堆积,我整理了下
写在前面 又到了年底跳槽高峰季,很多小伙伴出去面试时,不少面试官都会问到消息队列的问题,不少小伙伴回答的不是很完美,有些小伙伴是心里知道答案,嘴上却没有很好的表达出来,究其根本原因,还是对相关的知识点 ...
最新文章
- python 打包wheel文件,自己的SDK包
- 保护个人信息安全之法律思考
- 119. Leetcode 115. 不同的子序列 (动态规划-子序列问题)
- ​SpringCloud:统一异常处理
- Google Gson的使用方法及JSON 技术对比
- Spark IDEA 编程环境配置
- mysql linux设置密码_Linux下第一次使用MySQL数据库,设置密码
- 【Kafka】kafka-eagle几个指标含义
- java代码使用Pair元组-运行可以-编译失败
- Java基础 - 变量的定义和使用
- Grup加密(使其不能强制更改密码)
- java 多边形裁剪_使用 mesh 实现多边形裁剪图片!Cocos Creator!
- 如何让移动硬盘在Mac和Windows上通用使用
- ffmpeg之libx264编译安装方法及一键shell脚本
- 压缩文件已损坏怎么办?恢复压缩文件,解决方法看这里
- android手机不开机刷机,手机无法开机怎么刷机?安卓手机救砖教程
- linux_C_fork函数/execv/execl的使用_数据类型pid_t/getpid/sleep /warning: missing sentinel in function call
- MiniFilter文件系统学习
- 脾胃不好,有哪些在家可以做的暖胃汤方?
- 史上最全Python学习笔记(基于《Python学习手册(第4版)》)——Part3 语句和语法