关于面试 MySQL 的疑问

2023-05-31 17:51:21 +08:00
 gps32251070

最近的一次面试,面试官提到了一个 MySQL 场景,如下


表 t 只有两个字段,主键 id 和 varchar 类型的 name ,现在有一条 SQL:select id,name from t limit 2; 这条语句执行过程中很慢,问大概的原因。


思考了一下,感觉不是锁问题,所以答了下大概是服务器负载大,查询的 SQL 很多都是不重复的,导致数据页缓存命中有问题之类的,面试官不是很满意这个答案,后面快结束我又问了下这个问题,面试官回答大概意思是负载导致的锁的问题。

我的疑问是,这个 sql 语句不是走的快照读吗?又没有加 lock in share mode ,其他语句的锁怎么会影响到它的执行呢?还有一个可能是加了 MDL 写锁,但是 MDL 写锁在修改表结构的情况下才会发生,生产环境基本不会出现。有没有懂的老哥帮忙解答下?

3413 次点击
所在节点    程序员
58 条回复
xuanbg
2023-05-31 19:56:36 +08:00
@gps32251070 limit 2 是顺序读 2 条没错,可顺序怎么来的?不得排序先? 20 万数据没索引你排序一个试试看慢不慢就完了。
xuanbg
2023-05-31 19:58:40 +08:00
20 万里取 2 条的意思是先读 20 万,然后取 2 条啊,不是直接取 2 条!
JasonLaw
2023-05-31 20:09:20 +08:00
@xuanbg #18 虽然 type 是 ALL ,但是不代表它要扫描所有行。没有 offset 的时候,它只会找出前两行。

JasonLaw
2023-05-31 20:10:54 +08:00
@xuanbg #22 它只需要找出前两行就行了。如果觉得你是对的,麻烦给一下证据。

wushigejiajia01
2023-05-31 20:27:17 +08:00
关注一下
taogen
2023-05-31 20:37:44 +08:00
@xuanbg explain 中 type=ALL 的意思是全表扫描直到查到符合条件的数据。这里 limit 2 ,且没有 order ,扫到第二条数据的时候就满足要求,然后就返回了。我用 OP 的语句查了我生产数据库中一个 1.2G 的表,瞬间就返回了。
zengguibo
2023-05-31 20:41:58 +08:00
最大的可能是锁表了,可以使用 show processlist 看一下
fredcc
2023-05-31 20:43:43 +08:00
面试官没提到是什么表引擎吗
tutudou
2023-05-31 20:45:48 +08:00
数据多了,也会导致慢呀,嘴在他身上,他喜欢说什么就什么好了。
taogen
2023-05-31 20:52:37 +08:00
面试官可能是这个意思:一条看似不可能慢的查询 SQL ,在什么情况下会变慢?
chaleaochexist
2023-05-31 21:18:18 +08:00
如果数据库服务器的负载较高,例如同时有其他大量查询或者写操作,那么查询的执行时间可能会延长。这可能是因为数据库服务器资源不足,导致查询需要等待资源的可用性。
chaleaochexist
2023-05-31 21:18:31 +08:00
@chaleaochexist #31 GPT 说的.
koloonps
2023-05-31 21:20:06 +08:00
mark 下,我之前就遇到过 join 查询结果直接超时,换一台服务器就好的情况
xiangyuecn
2023-05-31 21:26:01 +08:00
什么负载不负载的,加钱皆可解决🐶 所以,原因是钱给少了
ccde8259
2023-05-31 21:26:23 +08:00
意味着执行计划不会有问题的情况下,下层结构会带来哪些可能的问题。
如果是 InnoDB 的话,首先是 Buffer Pool 本身访问就是需要 Mutex 的,有没有可能是等锁导致的慢呢?
进一步的,如果 Buffer Pool 没有命中就需要从磁盘拖数据,磁盘 IO 导致的慢呢?
从磁盘拖回来的数据如果是有问题的,比如刷出来了个 Crash 完以后 LSN 高于 Checkpoint 的脏页,从 Redo-Log 恢复数据导致的慢呢?
xiaofan2
2023-05-31 21:29:43 +08:00
1. 什么执行引擎?
sadfQED2
2023-05-31 21:30:01 +08:00
@JasonLaw 还真有可能慢,而且是我们线上真实遇到过的问题。我们最终查到的原因是因为我们机房交换机有问题,mysql 和业务服务器通讯过程中出现了丢包,丢包引起一系列问题,最终导致查询很慢。

面试官问这种目测他们也是遇到这种问题了吧,让他们排查网络问题
xiaofan2
2023-05-31 21:30:22 +08:00
@xiaofan2 继续没说完 2. 什么隔离级别 这些前提什么都没有 感觉问题无从下手啊
sadfQED2
2023-05-31 21:33:24 +08:00
面试官说了是负载问题,但是没说是什么负载啊,网络 io 打满,传输慢成狗,那无论什么查询都超慢是有可能的。

而且他也没说是 mysql 自己的问题,网络 io 打满,或者磁盘 io 打满,都有可能
yianing
2023-05-31 21:34:05 +08:00
MySQL 快照读不加锁

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

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

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

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

© 2021 V2EX