100列Application_user表中SELECT *与指定列查询的性能差异及原因
两个SQL查询的性能差异及深层原因
性能差异对比
select * from Application_user;的执行效率、资源占用远不如指定列的查询:- 数据传输量是后者的数倍(100列vs指定少量列)
- 数据库服务器和客户端的内存占用更高
- 整体执行耗时(磁盘IO+网络传输+数据处理)明显更长
核心原因
- 磁盘IO开销:数据库读取数据时,
select *要加载表中所有100列的磁盘数据,哪怕很多列根本用不上。如果表包含大字段(比如TEXT、BLOB),这种开销会呈指数级增长;而指定列的查询只需要读取目标列对应的磁盘块,甚至如果目标列刚好在某个索引里(覆盖索引),连表数据都不用读,直接从索引取数。 - 网络传输开销:更多的数据意味着要在服务器和客户端之间传递更大的数据包,带宽有限时,这部分耗时会占比很高。
- 内存与解析开销:服务器和客户端都要分配更多内存来存储这些额外数据,客户端解析结果集的时间也会随着数据量增大而增加。
- 索引利用率限制:
select *会破坏覆盖索引的优化可能——哪怕你查的列在索引里,只要用了*,数据库就必须回表读取全量行数据,而指定列的查询可以直接用覆盖索引完成查询,跳过回表步骤。
内容的提问来源于stack exchange,提问作者Syeda Maira Saad
相关产品推荐
相关产品推荐

