为什么大家都说 SELECT * 效率低
码农突围
共 3584字,需浏览 8分钟
·
2020-08-12 03:28
一、效率低的原因 1. 不需要的列会增加数据传输时间和网络开销 2. 对于无用的大字段,如 varchar、blob、text,会增加 io 操作 3. 失去MySQL优化器“覆盖索引”策略优化的可能性 二、索引知识延申 联合索引 (a,b,c) 联合索引的优势 索引是建的越多越好吗 三、心得体会
一、效率低的原因
增加查询分析器解析成本。 增减字段容易与 resultMap 配置不一致。 无用字段增加网络 消耗,尤其是 text 类型的字段。
1. 不需要的列会增加数据传输时间和网络开销
用“SELECT * ”数据库需要解析更多的对象、字段、权限、属性等相关内容,在 SQL 语句复杂,硬解析较多的情况下,会对数据库造成沉重的负担。 增大网络开销;* 有时会误带上如log、IconMD5之类的无用且大文本字段,数据传输size会几何增涨。如果DB和应用程序不在同一台机器,这种开销非常明显 即使 mysql 服务器和客户端是在同一台机器上,使用的协议还是 tcp,通信也是需要额外的时间。
2. 对于无用的大字段,如 varchar、blob、text,会增加 io 操作
3. 失去MySQL优化器“覆盖索引”策略优化的可能性
二、索引知识延申
联合索引 (a,b,c)
联合索引的优势
1) 减少开销
2)覆盖索引
SELECT a,b,c from table where a='xx' and b = 'xx';
3)效率高
select col1,col2,col3 from table where col1=1 and col2=2 and col3=3;
A. 如果只有单列索引,那么通过该索引能筛选出 1000W10%=100w 条数据,然后再回表从 100w 条数据中找到符合 col2=2 and col3= 3 的数据,然后再排序,再分页,以此类推(递归); B. 如果是(col1,col2,col3)联合索引,通过三列索引筛选出 1000w10% 10% *10%=1w,效率提升可想而知!
索引是建的越多越好吗
数据量小的表不需要建立索引,建立会增加额外的索引开销 不经常引用的列不要建立索引,因为不常用,即使建立了索引也没有多大意义 经常频繁更新的列不要建立索引,因为肯定会影响插入或更新的效率 数据重复且分布平均的字段,因此他建立索引就没有太大的效果(例如性别字段,只有男女,不适合建立索引) 数据变更需要维护索引,意味着索引越多维护成本越高。 更多的索引也需要更多的存储空间
三、心得体会
---END--- 重磅!码农突围-技术交流群已成立 扫码可添加码农突围助手,可申请加入码农突围大群和细分方向群,细分方向已涵盖:Java、Python、机器学习、大数据、人工智能等群。 一定要备注:开发方向+地点+学校/公司+昵称(如Java开发+上海+拼夕夕+猴子),根据格式备注,可更快被通过且邀请进群 ▲长按加群 推荐阅读
• 天天在用 Stream,那你知道如此强大的 Stream 的实现原理吗? • 项目是如何死掉的?太过真实! • 太牛了!高考失利只能进清华,35岁成阿里最年轻技术副总裁,他来自另一个平行世界! • 数据库链接池终于搞对了,这次直接从100ms优化到3ms! • Google 再见 Java • 面试官:我把数据库部署在Docker容器内,你觉得如何? 最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。 获取方式:点“在看”,关注公众号并回复 BAT 领取,更多内容陆续奉上。 如有收获,点个在看,诚挚感谢明天见(。・ω・。)ノ♡
评论