为什么程序员都说 SELECT * 效率低,那究竟是什么原因造成的?
面试官:“小陈,说一下你常用的SQL优化方式吧。”
增加查询分析器解析成本。
增减字段容易与 resultMap 配置不一致。
无用字段增加网络 消耗,尤其是 text 类型的字段。
1. 不需要的列会增加数据传输时间和网络开销
用“SELECT * ”数据库需要解析更多的对象、字段、权限、属性等相关内容,在 SQL 语句复杂,硬解析较多的情况下,会对数据库造成沉重的负担。
增大网络开销;* 有时会误带上如log、IconMD5之类的无用且大文本字段,数据传输size会几何增涨。如果DB和应用程序不在同一台机器,这种开销非常明显
即使 mysql 服务器和客户端是在同一台机器上,使用的协议还是 tcp,通信也是需要额外的时间。
2. 对于无用的大字段,如 varchar、blob、text,会增加 io 操作
3. 失去MySQL优化器“覆盖索引”策略优化的可能性
二、索引知识延申
● 联合索引 (a,b,c)
where条件 | 效果 |
where a=1 and c=1 | 只使用了一级目录,c在三级目录,没有使用二级目录,那么三级目录就没法使用 |
where a=1 and b=1 | 只使用了一级目录、二级目录。 |
● 联合索引的优势
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,效率提升可想而知!
● 索引是建的越多越好吗
数据量小的表不需要建立索引,建立会增加额外的索引开销
不经常引用的列不要建立索引,因为不常用,即使建立了索引也没有多大意义
经常频繁更新的列不要建立索引,因为肯定会影响插入或更新的效率
数据重复且分布平均的字段,因此他建立索引就没有太大的效果(例如性别字段,只有男女,不适合建立索引)
数据变更需要维护索引,意味着索引越多维护成本越高。
更多的索引也需要更多的存储空间
三、心得体会
作者:_陈哈哈
blog.csdn.net/qq_39390545/article/details/106766965
Spring Cloud 中 Zuul 网关到底有何牛逼之处?竟然这么多人在用!
一次神奇的 sql 查询经历,group by 慢查询优化记录
腾讯 Tendis 正式开源,兼容 Redis 协议企业级分布式高性能 KV 存储数据库
中国铁路 12306 网站的高并发架构带来的思考?研究分析后,果然超牛逼…
IDEA JetBrains 推出 Mono 编程字体真牛逼,更适合程序开发人员!
为什么阿里规范中要求代码禁用 static 修饰 SimpleDateFormat?
心惊肉跳,新来的程序媛妹纸 rm -rf 把公司整个数据库删没了!
为什么很多 Spring Boot 开发者放弃了 Tomcat,选择了 Undertow ?