select * 和 select 字段的区别

摘要:介绍 select * 和 select 字段的区别,建议各位不要使用 select *

  在千万级表中查询数据的时候,需要千方百计提升查询效率,为用户带来最爽的体验;业界各位大佬都提到 select * 的效率会低于select字段,且推荐使用select字段。就连《阿里Java开发手册》也明确表示不得使用 select * 作为查询的字段列表,更是让这条金科玉律拥有了权威的加持。

d097461453c592e698e11281d28dfd99.png

查询效率

  select * 在系统解析的时候,会多一步从系统表获取具体字段、权限、属性等相关内容的步骤,即先执行Query Table Metadata For Columns,一定程度上为数据库增加了负担。而后者无此过程。

网络带宽

  结果集的数据量也会直接影响响应速度。select * 会查出所有的字段,有些是不需要的。尤其是当应用程序和服务器不在同一个局域网时,冗余字段过多,会影响网络传输的性能。这一点在查询表存在大字段的情况下愈发明显,大量数据的传输必然消耗更多网络带宽,拖慢传输速度。

结果集扩展能力

  在表结构保持不变的前提下,核心结果集相同,但是select 字段的顺序可以调整,select * 则固定不变,和表结构中字段定义顺序保持一致。如果修改了表结构,select * 能够获得新表结构的所有字段;select 字段在增加字段时不会输出新字段,而且若被查询字段出现被重命名或者被删除的情况,则会报错。

应用场景

  select * 效率稍低但是能应对频繁调整的表结构,适应力强,可应用于开发环境,仅极少数特殊业务场景会在生产环境使用;后者效率稍高,语义明确,更能清晰的表达业务需求,强烈推荐在生产环境中使用。

覆盖索引

  在 MySQL 中,索引和数据是存在一起的,如果查询的数据和搜索条件在某个索引上就能够找到,也就是使用了覆盖索引,能够直接摒弃回表操作,减少IO次数,速度必然比去磁盘扫描快的多。如果 MySQL 和应用程序不在同一台机器,那么这种开销就会更加明显。因此,在使用 select 的时候,建议让搜索的字段和查询条件是索引上的字段信息。

连接查询时,* 无法进入缓冲池

  MySQL 中连接查询的原理是先对主表(驱动表)进行查询操作,然后再用从驱动表得到的数据作为条件,逐条的到被驱动表进行查询。

  每次驱动表加载一条数据到内存中,然后被驱动表所有的数据都需要往内存中加载一遍进行比较。效率很低,所以mysql中可以指定一个缓冲池的大小,缓冲池大的话可以同时加载多条驱动表的数据进行比较,放的数据条数越多性能io操作就越少,性能也就越好。所以,如果此时使用select * 放一些无用的列,只会白白的占用缓冲空间,浪费本可以提高性能的机会。

结束语

  文章到这里就结束了,看完之后你有什么想法想要跟大家分享呢?评论区在等着你!

Reference

posted @ 2022-09-17 09:54  楼兰胡杨  阅读(52)  评论(0编辑  收藏  举报