数据库sql篇——关于select*和select全部字段的区别

记录今日开发中的优化sql优化项。

介绍 select * 和 select 字段的区别,建议不要使用 select *。

在千万级表中查询数据的时候,首要任务是提升查询效率,为用户带来极致的体验;今天开发组领导提到了 select * 的效率会低于select字段,且推荐使用select字段。就连《阿里Java开发手册》也明确表示不得使用 select * 作为查询的字段列表,更是对此进行了背书。

一,查询效率

  select * 在系统解析时,会多一个步骤(从系统表获取具体字段、权限、属性等相关内容),即优先执行 Query Table Metadata For Columns,因此给数据库增加了一定的负担,而select字段则没有这个过程。

二,覆盖索引

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

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

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

  每次驱动表加载一条数据到内存中时,被驱动表所有的数据都需要往内存中加载一遍进行比较,导致效率很低。所以Mysql中可以指定一个缓冲池的大小,缓冲池大的话可以同时加载多条驱动表的数据进行比较,放的数据条数越多IO操作也就越少,性能也就越好。

  所以此时使用select * 放一些无用的列,只会白白占用缓冲空间,浪费提高性能的机会。

四,网络带宽

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

五,应用场景

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

六,结果集扩展能力

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

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值