关于面试 MySQL 的疑问

335 天前
 gps32251070

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


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


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

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

3080 次点击
所在节点    程序员
58 条回复
JasonLaw
335 天前
这是一个很傻逼的问题,我想不出任何理由会导致 select id, name from t limit 2 慢。
JasonLaw
335 天前
ta 说负载导致的锁的问题,那具体是什么呢?什么负载?造成了什么锁?
bk201
335 天前
select 还能导致锁问题?
gps32251070
335 天前
@JasonLaw 意思是 mysql 负载大,具体锁没说,就说查询会加锁,我看他不怎么想继续就没细问
himly1
335 天前
@bk201 会啊,如果有 sql 对当前 sql 涉及的数据加了 X 锁,就会阻塞.
gps32251070
335 天前
@himly1 这个语句是快照读,没有加任何锁
liprais
335 天前
面试官半瓶子醋,不用搭理他
himly1
335 天前
可能是 innodb 且负载太大,其中大部分都是写操作,那么就有可能是因为 x 锁导致 select 语句无法读取 s 锁, 导致一直处于阻塞状态,所以会慢。
gps32251070
335 天前
@himly1 语句没有加 lock in share mode 啊,怎么会加锁
himly1
335 天前
@gps32251070 学到了
wangnimabenma
335 天前
刷脏页会抖一下,但是和这个好像没关系
admol
335 天前
这个 MySQL 45 讲 里面好像有讲到。
1 、 如果是数据库本身就有很大的压力,那所有的 SQL 都会很慢,不仅是你这个 SQL
2 、表被锁了(等 MDL 锁、等 flush 、等行锁)
3 、慢查询(有其他 SQL 影响)
xuanbg
335 天前
就是记录数太多了且没有任何索引。譬如上亿条数据里面查 2 条,也是是全表扫描,自然慢得一逼。
JasonLaw
335 天前
@xuanbg #13 没有索引也没事吧,它只是找出两条,它不在意总量多大,它的时间复杂度不是 O(n),而是 O(1)。
gps32251070
335 天前
@xuanbg 没索引也没有任何关系吧,没有任何 where 条件
gps32251070
335 天前
@xuanbg 而且面试官给我的方向是锁导致的问题
gps32251070
335 天前
@admol 我考虑到 1 ,3 点了,所以说了数据页问题。第二点 MDL 可能性很低,谁会高并发改表结构?行锁问题这个语句没有加任何锁,所以也不需要等锁吧,快照读
xuanbg
335 天前
@JasonLaw 不信你自己建个表看看执行计划是不是 all 就完了嘛。
xuanbg
335 天前
@gps32251070 没索引不是一定有问题,但记录数多还没索引就遭不住。。。
gps32251070
335 天前
@xuanbg 忘了补充,面试官给的数据量是 20W ,这数据量不加读锁顺序 limit 2 我想不出导致性能问题的底层原因

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

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

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

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

© 2021 V2EX