请教一个 MySQL 的问题

111 天前
 dumbbell5kg

这有两条 SQL 与各自稳定的执行时间,表记录是 1000w 条,平均单条记录大小 700b

SELECT * FROM `user_operation_log` 	  LIMIT 1000000, 1; 0.3s
SELECT user_id FROM `user_operation_log` LIMIT 1000000, 1; 0.5s

为什么 SELECT user_id 比 select * 快这么多?

两者执行计划的 type 都是 all 。

期待大佬答复。

1923 次点击
所在节点    MySQL
26 条回复
dumbbell5kg
110 天前
@tinyzilan123 测了,时间随着 column 数量的增加而增加,你说的“数据量拷贝”是指哪个过程的拷贝呀,
数据到客户端,还是数据页从磁盘到内存?
q727729853
110 天前
mysql 可以分为两层:sever 层和存储引擎层。
流程:先到存储引擎层查数据,然后返回给 sever 层进行过滤。limit 是在返回数据给客户端的时候才执行的。
因此,本质上是 sever 层向存储引擎层获取数据 1000020 次,时间花费在了 io 上
tinyzilan123
110 天前
@dumbbell5kg #21 是从 mysql 存储层到 mysql 服务器层,这里的 limit 100000,1 实际上包含了 order by id asc 的操作,这样 mysql 才能正确的从排序后的数据获得前 1000000 条数据,再返回结果。
而排序这个操作是需要在服务器层处理的,因此需要将数据拷贝到内存再进行排序后才能获得结果。
darklost
110 天前
... 你猜列出文章标题和列出整篇文章那个快
IamUNICODE
110 天前
user_id 是主键吗,还有*的内容有多少,是不是数据吞吐上就有不同?
dumbbell5kg
110 天前
@tinyzilan123
@q727729853
终于明白了,感谢两位,根据两位的提示,我也在这里
https://developer.aliyun.com/article/763836
找到了更详细的答案

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1048143

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX