为什么不建议使用 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中存在较少的数据行,导致循环次数增加。