为什么select * 会导致查询效率低
原因:
- 不需要的列会增加数据传输时间和网络开销
- select * 会需要解析更多的对象、字段、权限、属性等相关内容,会给数据库造成负担。
- 增大网络开销。* 有时会误带上如log、IconMD5之类无用的大文本字段,数据传输size会几何增涨。
- 对于无用的大字段,如varchar、blob、text 会增加io操作
- 长度超过728字节的时候,会先把超出的数据序列化到另一个地方,因此读取这条记录会增加一次io操作。
- 失去mysql优化器“覆盖索引”策略优化的可能性
-
例如,有一个表为t(a,b,c,d,e,f),其中,a为主键,b列有索引。
那么,在磁盘上有两棵 B+ 树,即聚集索引和辅助索引(包括单列索引、联合索引),分别保存(a,b,c,d,e,f)和(a,b),如果查询条件中where条件可以通过b列的索引过滤掉一部分记录,查询就会先走辅助索引,如果用户只需要a列和b列的数据,直接通过辅助索引就可以知道用户查询的数据。
如果用户使用select *,获取了不需要的数据,则首先通过辅助索引过滤数据,然后再通过聚集索引获取所有的列,这就多了一次b+树查询,速度必然会慢很多
-
参考:https://mp.weixin.qq.com/s/uUj83OzuHm67R1yG-qajkw