在实际开发过程中,有人喜欢或者习惯性地使用 select * from tablename 进行数据查询,当然使用*代替具体的字段名称还是有一些好处:
1.一定程度上减少了代码量,不需要输入具体的字段,用一个星号就可以代替所有字段;
2.无需知道表的字段名,避免输入具体字段的繁琐或输入错误;
3.当被查询的表新增字段时,无需修改select语句的代码,一定程度上提高代码复用率。
虽然Select * 带来了一些好处,但同时存在很大的问题和隐患:
1.它比只获取部分字段时更耗资源:包括IO ,内存资源 CPU资源等数据库资源和网络资源。就像平时从水井里面打水一样,一次性取半个水桶和取满水桶消耗的体力是完全不同的,select * 就相当于取满水桶,消耗的资源相对也比较多;
2 .容易导致索引失效,效率低 ,特别是覆盖索引无法被充分使用。
覆盖索引是筛选条件(如where 子句、group by 子句和 order by子句等)涉及的字段以及select后面字段组成的索引。如果使用了select *,不可能给表创建一个覆盖所有字段的索引,即使使用到已有的覆盖索引,也需要进行回表查找;
3 .优化起来比较困难,特别是无法添加覆盖索引。
在慢查询语句排查中如果发现 select a,b,c from tablename where e =2 效率比较低,在分析执行计划后,如果发现该sql没有使用到索引,而是走了全表扫描,这时候我们就可以针对字段e,a,b,c创建覆盖索引。而如果采用的是select * from tablename where e =2 的查询方式,就无法创建覆盖索引。
综合以上情况,在日常的开发中,除一些特殊场景外,建议尽量不使用select * from 的形式进行数据的查询,而使用具体的字段名代替*,为后续性能优化提供便利。