搜索
当前位置:首页 > 知识 > sql查询全部数据

sql查询全部数据

发表于 2026-10-17 06:05:24 来源:烟消火灭网

打开一张用户表,询全敲下 SELECT * FROM users;,部数按下回车,询全三万行数据哗地铺满屏幕——这是部数很多人学 SQL 的第一课,也是询全生产环境里最容易被 DBA 骂的一句话。问题不在语法,部数它没错,询全错在“全部”这个词太诱人。部数

我见过一个真实的询全例子。某电商后台的部数订单表,单表 4700 万行,询全一位新同事为了“先看看数据长什么样”,部数直接跑了 SELECT * FROM orders;。询全结果查询跑了 40 多秒,部数把连接池占满,询全前端页面集体转圈。他没做错什么逻辑,只是把“全部”理解成了“无代价”。

“全部数据”到底指什么

SQL 里的全量查询,字面意思是取回表中所有行、所有列。写法简单到只有一行:

SELECT * FROM table_name;

星号代表所有列,没有 WHERE 就是所有行。可数据库执行这条语句时,做的事情远比字面复杂:它要扫描整张表,读取每一行的每一个字段,再通过网络把结果集传给客户端。数据量小的时候你感觉不到,一旦上百万行,内存、带宽、磁盘 IO 全都在替你买单。

所以“查询全部数据”在工程上通常不是一个动作,而是三个问题:查哪些列、查哪些行、查多少条。

列比行更容易被忽视

很多人盯着行数,却忘了列也在消耗资源。一张宽表如果有 80 个字段,其中包含 TEXT、BLOB 类型,SELECT * 会把它们全部拉出来。而你真正需要的可能只是 id、name、created_at 三列。

改成 SELECT id, name, created_at FROM users;,同样的行数,传输量可能降到原来的十分之一。覆盖索引还能让数据库直接从索引里取数,连主表都不用回。这不是微优化,是数量级的差别。

行要分批,不要一次吞

如果确实要遍历全表,比如做数据迁移或离线统计,正确姿势是分页或游标。MySQL 里常见的是:

SELECT id, name FROM users ORDER BY id LIMIT 1000 OFFSET 0; SELECT id, name FROM users ORDER BY id LIMIT 1000 OFFSET 1000;

但 OFFSET 越大越慢,因为数据库仍要跳过前面所有行。更好的做法是用游标字段:

SELECT id, name FROM users WHERE id > 1000 ORDER BY id LIMIT 1000;

每次记住上一批的最大 id,下一批从它之后取。这样每批都走索引,速度稳定,不会随页码增加而变慢。我自己的习惯是批量大小控制在 500 到 2000 之间,具体看单行宽度和网络延迟。

什么时候真的需要全量

不是所有全量查询都该被禁止。数据量在几万行以内、只查必要列、在从库或离线库上跑、加上合理的超时和限流,这些情况下直接查全表是合理的。真正危险的是在高峰期的生产主库上,用 SELECT * 无限制地拉数据。

另一个容易被忽略的点:客户端驱动默认会把结果集全部加载进内存。哪怕你写了 LIMIT,某些 ORM 或驱动仍可能一次性 fetch。用流式查询或服务端游标,才能做到边读边处理。

SQL 本身不复杂,复杂的是数据量和场景。SELECT * FROM t; 是一把没有保险的枪,知道它什么时候会走火,比记住语法更重要。

随机为您推荐
友情链接
版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright © 2016 Powered by sql查询全部数据,烟消火灭网   sitemap

回顶部