【为什么不建议使用 SELECT *】

为什么不建议使用 SELECT *

我们在学习和工作中写SQL时,总会有人告诉我们不能使用SELECT * 查询,但是为什么不能使用?他们好像没告诉我们。

MySql数据库简单的数据模型如下:

现在有如下表

CREATE TABLE USER
(
    USER_ID        VARCHAR(32) COMMENT '用户主键',
    USER_USERNAME  VARCHAR(32)  NOT NULL COMMENT '用户名',
    USER_FULLNAME  VARCHAR(128) NOT NULL COMMENT '用户姓名',
    DEPTID         VARCHAR(32)  NOT NULL COMMENT '所属部门',
    PRIMARY KEY (USER_ID)
) ENGINE = INNODB

当我们运行下面SQL:

SELECT * FORM USER WHERE USER_ID = '1';

上面SQL执行流程如下:

  • 客户端发送原始查询SQL
  • server进行认证、计算SQL最优的执行方案
  • 储存引擎读取表数据(不考虑覆盖索引的情况)
  • server接受到服务端的数据,进行处理,并把处理后的数据放入net_buffer
  • net_buffer达到最大值时,返回数据到客户端
  • 重复3-5步骤,知道符合条件的数据被读取完毕

步骤4中提到net_buffer

  • 服务端处理后的数据需要先放到net_buffer中去,而不是处理一条返回一条
  • MySql默认设置大小为:16384 bytes(16
    kb),

理解net_buffer概念后,如果我们只需要用户ID、USERNAME的话,SQL应该改写如下:

SELECT USER_ID, USER_USERNAME FORM USER WHERE USER_ID = '1';

这样返回相同数量的查询语句中,减少单行数据所占用内存的大小,在net_buffer中储存更多的行数,从而减少服务端和客户端的交互次数。
如果是多表关联查询时,如果存在join_buffer,那么也会是join_buffer中存在较少的数据行,导致循环次数增加。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值