在平时写业务代码中,为了简单或者使用方便,或者使用orm
时,很容易直接或者间接去使用select *
查询数据库数据。
那么select *
到底有什么弊端,不推荐使用呢?
增加了网络带宽
这一点在查询表存在大字段的情况下显得尤为明显,大数据的传输必然会减缓传输的速度。
覆盖索引
当单表数据量随着业务增长变得比较庞大之后,全表扫描是不可接受的,我们会针对业务在表中增加一些索引,可以是单个字段组成索引,或者多个字段组成索引。
在mysql
中,索引和数据是存在一起的,如果查询的数据在索引上就能够找到,无需再根据索引上的位置信息二次扫描磁盘,减少IO次数,速度必然是去磁盘扫描快的多。覆盖索引
就是说的查询字段完全属于构建索引的字段。因此,在使用select
的时候尽可能的让搜索的字段是索引上的字段信息。
补充一点,select *
和select 全部字段
的查询速度相差不大,唯一区别是前者会先执行Query Table Metadata For Columns
,一定程度上为数据库增加了负担。