看那个 MySQL 是怎么运行的,看了一遍对这部分还是迷迷糊糊,感觉细节,概念很多,把握不到整体的一个结构。
1
XiLemon 2021-03-13 11:26:12 +08:00
入门当然是 MySQL 45 讲,然后就是何登成大佬的博客,配合官方文档。
|
2
pedia 2021-03-13 12:18:34 +08:00
这块涉及的内容比较多了 想深入了解只能看源码了 有问题上社区 https://fastdb.cc/ 问我咯.
|
3
simonv3ex 2021-03-13 14:05:22 +08:00 3
收藏从未停止,学习从未开始[doge]
|
4
gBurnX 2021-03-13 14:26:57 +08:00 7
模电(模拟电路)讲锁的来历、最原始锁的电路原理、设计与性能。
数电(数字电路)讲锁与上层数字化系统的衔接与应用。 学习主板与 CPU 结构,分析锁的发展史。比如从单核、多核、多 CPU 结构,在这些不同情况下,锁的结构与性能完全不一样,用法也不同。 到了操作系统层次,结合前面 CPU 与主板,来看看操作系统的调度、进程线程纤程,如何把底层单一的锁,发展成各种特性的锁。比如原子锁,自旋锁等等。 接着到了数据库。数据库对操作系统层次的锁,进行了进一步的包装,根据业务需求生成了行锁、表锁、全局锁等等。不同的数据库,这一块的设计与实现也会有差异。具体应该根据数据库代码与文档为主。 想把锁学好,就从上往下学。时间不够,只想学个大概,就从下往上学。 |
7
zhangysh1995 2021-03-13 19:48:09 +08:00 1
@zxCoder 前段时间给 MySQL 报了一个 bug,是和并发相关的,涉及到了很多基本概念的讨论,有兴趣可以看一下。https://bugs.mysql.com/bug.php?id=102752
|
8
dzdh 2021-03-13 20:21:55 +08:00
@zhangysh1995 所以到最后到底是不是个 bug
|
9
ZeawinL 2021-03-13 20:34:21 +08:00 via Android
高性能 MySQL,MySQL 技术内幕?
|
12
AxEqaq 2021-03-13 21:35:38 +08:00
|
13
gBurnX 2021-03-13 22:43:36 +08:00 1
@pedia 这应该是知识树构建的不一样,造成的理解问题吧。
如果你完整地从底层开始,逐步学习了这些知识,按照层次划分,数据库的锁就是对 OS 提供的进行包装而已。 但如果你没有系统地构建知识树,你可能会说,数据库的锁本质是由更下层的模块提供,比如指令,CPU 甚至电路等等。你这种说法当然也没错。 |
18
gBurnX 2021-03-13 23:18:40 +08:00
@AxEqaq 有些比较负责的学校,本科要毕业,至少要写个 OS 原型与 DB 原型。花点时间认真学学,把这两块做好,其实数据库也就那么一回事。
基础打扎实后,实际工作中,数据库方面的问题,就不需要浪费时间再去纠结基础知识了,更多的是分析业务,针对业务做优化。不同业务需要的优化方案完全不一样。 |
20
AxEqaq 2021-03-13 23:25:07 +08:00
@gBurnX 本科做的 os 原型我不说啥,db 那就是个最简版的 nosql,这些课堂作业做的 lock 更严谨点应该叫“封装了下 latches”······
|
21
AxEqaq 2021-03-13 23:29:00 +08:00
而且你还在上学?要以后写业务?确定不了解下 mysql 的锁?这个其实有助你做业务,我去年做个一个技改项目就是将 mysql 迁移至 mongodb 并对上层重构,tps 翻了近 10 倍,而且无须考虑未来五年扩容,如果对 db 了解不深刻,架构师很容易怼人
|
22
pedia 2021-03-13 23:30:40 +08:00 1
@gBurnX
”如果你完整地从底层开始,逐步学习了这些知识,按照层次划分,数据库的锁就是对 OS 提供的进行包装而已。 但如果你没有系统地构建知识树,你可能会说,数据库的锁本质是由更下层的模块提供,比如指令,CPU 甚至电路等等。你这种说法当然也没错” 通过你的说法 我甚至可以判断你根本不理解数据库里的锁是什么. |
23
gBurnX 2021-03-13 23:41:49 +08:00
@AxEqaq
1.我觉得,自己应该对自己负责,不能只按毕业最低要求去搞。不然这么多竞争者,以后工作都不好找。 我当时的室友,学 C 时,一个章节的课后作业就写了 3k 行代码; C++课,他直接写了个 wow 那种无边界地图的底层引擎; 多媒体课,他写了个联机飞行游戏; 他大一假期就被一堆公司预定,毕业论文直接被评为省优,毕业时 bat 还有一堆公司是邀请他去。 2.我已经工作几年了。建议你应该从模电->数电->OS->数据库,走那么一遭,因为上层的锁,都是由底层提供原理、实现方法与性能。你把底层学完,数据库你也能实现,只是个时间问题。mysql 锁真没那么神奇,那些什么 mysql 内幕的书籍,也就是讲讲设计方法与内部细节,你如果把基础打扎实,比如底层、数据结构与算法,这些解密的书也就那么回事,有空翻翻,不看也罢。 3.mongodb,我室友和我说过,要注意一下它的坑,10gen 团队早期为了融资,故意想抬高 mongodb 的跑分,它默认的写入策略是 mongodb server node 收到 client 发来的数据后,先回应 client 说已经写入,然后再来进行写入,如果 server node 内部负载较高时,导致写入失败,此时 client 以为已经写入,这数据本质上就算是丢了。早期 mongodb 因这问题,导致一些 dba 丢工作。你现在用 mongodb,建议扒开代码看看这个坑还在不在,跟着源码 debug 一次,因为这坑在负载低时不容易检查出来。 |
26
AxEqaq 2021-03-13 23:59:55 +08:00
@gBurnX
1.2.工作几年还是大一找实习? 3.辛苦您了解下 2pc3pc,另我的 mongo 集群在双 11 和 618 期间单个 shard 最高峰写入量 20w/min,淡季每周集群写入接近 300 亿文档 |
27
gBurnX 2021-03-14 00:00:53 +08:00
@pedia
1.你把数据库的行锁与表锁称为逻辑锁,那么逻辑锁又是怎么完成锁功能的呢? 我在前面一直强调底层,强调包装,就是希望避免有人被文档或书籍换个名词,就不知道它的本质了。 2.我不是大一。你应该再细心些看看我之前的评论。那个问题是帮朋友的弟弟提的。 |
29
pedia 2021-03-14 00:06:32 +08:00
@gBurnX 逻辑锁的意思通俗解释是 0 代表持锁,1 代表不持锁,事务是否持有锁只需要判断状态位为 0 或者 1, 并不需要你所说的操作系统的锁来实现.
|
30
gBurnX 2021-03-14 00:10:50 +08:00
@AxEqaq
1.我工作好几年了。 2.nPC 问题,没记错的话,第一次提出是在通信原理课程,还不是数据库课程。这个知识点,数据库书籍没有通信原理讲的清楚,建议你还是去看看通信原理。以前 2G + 绿皮车在山洞里,测出 5PC 都不够用。 3.你发公司设备峰值写入量 20w/min,每周 300 亿文档,我能说啥好....如果你在 v2 那个微信群,看到小伙伴前几天发他自己家里设备,4k 60MB/s 与 seq 9GB/s,估计你们公司老板应该会很羞愧吧。。 |
32
pedia 2021-03-14 00:16:06 +08:00
|
33
gBurnX 2021-03-14 00:23:02 +08:00
@pedia
你看,数据库书籍,先把操作系统的锁,换个名词叫 latch 。然后自己搞一套东西叫 lock 。最终自己搞的 lock,仍然需要 latch (操作系统的锁)来提供最基本的功能。 这不就我最开始说的:数据库对操作系统层次的锁,进行了进一步的包装,根据业务需求生成了行锁、表锁、全局锁等等。你摸着自己的良心,评价一下,我这句话有错嘛? 而且,我从一开始,就建议,一定要多学学底层,这样就不会被数据库书籍,换个名词,就给整蒙了。 对于底层来说,锁就那么一回事。数据库为了标榜自己,不换个名词,怎么能有名气?你看 10gen 为了拉投资,早期干的那些事。 |
34
AxEqaq 2021-03-14 00:25:10 +08:00
@gBurnX
1 工作几年没看得出,但一定没做过互联网吧? 2 分布式系统必须要考虑的,你说的 normal 写入模式也是如此 3 不要拿 iot 说事,拿到互联网就是渣渣,老老实实时序数据库不好吗,假装退休的老板姓马,不过最近我要撤了 4 我替那兄弟答了,一个 latches 可能会占几个时间片,一个 db lock 占用的时间片轻松几百个,os 才不干这种累活 |
35
gBurnX 2021-03-14 00:33:00 +08:00
@AxEqaq
1.看不出别人真实工作年限,这太正常了。如果你熟悉 HR 圈,就会明白,只有极少数水平超高的业内面试官,才有可能猜准。 2.分布式系统,考不考虑是一回事,实际工作中知不知道是另一回事。顺便问问你,你们如何检查数据库在读取数据时,有没有遗漏或读错? 3.我没提 iot,你是怎么看出来我提的? 4.我问他的问题是 [如果不需要操作系统的锁,那么怎么解决多把逻辑锁的并发问题?] ,你的回答,在答个啥? |
37
gBurnX 2021-03-14 00:57:17 +08:00
@AxEqaq
2.杠我有必要提醒你 MongoDB 的黑历史? 杠我有必要建议你那公司设备数据其实没啥现在有更好设备了但你没看出? 杠我有必要提醒你 MongoDB 除了前面黑历史外,其实还有数据 io 的坑,但你也没看出? 4.我第二次说,我从头到尾就没说过这玩意是一码事。 不知道是第几次说,那玩意就只是包装了 OS 的锁,不用太在意,真就那么回事... 另外没必要一直被数据库书籍的名词牵着鼻子走。 研究数据库,应该跟着业务走,总在基础这里过不去,浪费时间,你真不如把底层好好学学,尽早去研究业务。 |
38
AxEqaq 2021-03-14 01:40:07 +08:00
|
39
Goldilocks 2021-03-14 03:23:06 +08:00 via Android
如果你对锁这块特别感兴趣,你可以去看看 software transaction memory 的书,看它是怎么实现的。基本上数据库里所有和锁相关的东西都在里面了。然后回头再来看数据库的文档
|
40
dartabe 2021-03-14 05:27:35 +08:00
硬件的锁也是实现软件的算法而已 所以了解一下很简单
|
41
patagonia111010 2021-03-14 07:19:21 +08:00
@gBurnX 数据库的锁确实和操作系统的锁不是一个东西啊,不要不懂装懂,你个蠢货还以为是换个名词?
|
42
zhaoxj58 2021-03-14 12:45:07 +08:00 via iPhone
我之前买了极客时间 MySQL45 讲的课,还看了高性能 MySQL 这本书。前者入门,后者进阶
|
45
gBurnX 2021-03-14 21:24:40 +08:00
@patagonia111010 这位暴躁老哥,建议您先把前面的评论,大声朗读 100 遍,再来评论。连文字就没看清,就过来胡说八道,也是够了。
另外看了一下,您几乎每条评论都是粗鄙之语,建议贵家长加强家教。先学会做人,才能做好事情。 |
46
zhangysh1995 2021-03-14 21:26:34 +08:00
@dzdh 实现和 MySQL 设计是一致的,但是文档写的不太对。
|
47
gBurnX 2021-03-14 21:26:48 +08:00
@AxEqaq
我在上面已经说了很多次,实习那个帖子,是帮别人发的...如果您看不清楚,我在这里多发几次: 实习那个帖子,是帮别人发的。 实习那个帖子,是帮别人发的。 实习那个帖子,是帮别人发的。 看清楚了吗?要不再多读几次,加深印象? |
48
py2ex 2021-03-14 23:07:45 +08:00
@gBurnX #4 模电数电中锁概念的体现 /应用在哪里? 计算机专业,模电数电时序逻辑只学过导论。
CPU 层面和锁沾边的是中断,但是由于没有研究过多核 CPU,不作评价。 操作系统层面需要应对多进程共享信息的问题,锁概念开始大量应用。 |
49
reself 2021-03-15 00:15:18 +08:00 via Android
这逼装的,尬得一逼。。。
|
50
love2020 2021-03-15 09:01:00 +08:00
通篇阅读了一下感觉还是戾气太重了啊哈哈
|
51
Hieast 2021-03-15 11:11:48 +08:00
@py2ex #35 只要共享某一个资源对业务来说会出问题时就会用到锁的概念。用计算机系统视角来看的话就很好理解,计算机系统有个基本的原则,即软件和硬件在逻辑上是等价的。
就 cpu 层面,中断还是停止了当前的程序去做别的事情,跟锁确实不相关。跟锁更相关的是流水线功能,流水线里的资源是加法器、乘法器等等,业务是指令,在资源上有专门的寄存器来表示锁。 确实戾气太重了,人身攻击、说非技术话题的的都 block 了。有的人能够主动重构知识体系兼容更多领域,有的人就只是守着自己领域的那一套,都能生存,但是适者可以活得更好。 |
53
gBurnX 2021-03-19 19:11:43 +08:00
@pedia
我不懂?我瞎说?行,首先感谢本论坛,不能修改评论,不能删除评论。现在,我们来复盘一下你回复我的评论: 1.两条是直接否定我的观点,但你没解释原因,也没提出更好的观点。6 楼,22 楼。 2.一条是学数据库书籍,换个名词。25 楼。 3.我在 27 楼问你 [逻辑锁又是怎么完成锁功能] ? 你在 29 楼说 [并不需要操作系统的锁来实现] 。 我在 31 楼问你 [不需要操作系统的锁,那么怎么解决多把逻辑锁的并发问题] ? 然后你在 32 楼说 [这需要 latch 互斥] 。接着往前翻,你在 25 楼说 [操作系统的锁在数据库称为 latch] ,带入你在 32 楼的话后,你在 32 楼的发言就成了 [这需要 操作系统的锁 互斥] 所以,你的观点是: A.逻辑锁,完成锁功能,不需要操作系统的锁来实现。 B.逻辑锁,完成锁功能的多把逻辑锁的并发问题时,需要操作系统的锁来实现。 你自己这完全相反的说法,怪我不懂?怪我瞎说?怪我误导别人? |
55
gBurnX 2021-03-20 15:22:23 +08:00
@pedia 那些说我不对的人,我回复让他们来解释,结果都不敢出来解释,你觉得他们真的懂?
而且,你觉得我说错了,我让你解释,你吓到直接 block 我。但凡你有点真本事,需要这样做? 借你的话,还给你:不懂就不要瞎说了 误导别人。 我好心给楼主普及知识,你们这样的人过来喷一句不对,既不解释原因,也没给出更好方案。你们真的懂?你们真的有证据证明我说错了?你们为啥会出来喷,你们自己心里不是心知肚明? |
56
patagonia111010 2021-03-20 18:45:11 +08:00
@gBurnX 别哔哔了 数据库的锁本来就和操作系统的锁不是一个东西 不是你理解的改个名词,看看这帖子多少人说你说的不对了,还嘴犟,属驴的?
|
57
patagonia111010 2021-03-20 18:47:52 +08:00
@gBurnX 不懂就 Google 一下 latch vs lock,一知半解就出来胡说.
|
58
gBurnX 2021-03-20 21:58:03 +08:00
@patagonia111010
又是一位几乎每条评论都是粗鄙之语的暴躁老哥,再次建议贵家长加强家教。先学会做人,才能做好事情。 暴躁归暴躁,技术问题,建议您先把前面的评论,大声朗读 100 遍,再来评论。连文字就没看清,就过来暴躁+胡说八道,也是够了。 |
59
sunriz 2021-03-21 01:52:38 +08:00
@gBurnX mysql 锁和 os 锁这个问题,虽然我不了解细节,但我感觉你说的是理解的“道”,是抽象出来的的一个共性的概念,其他人说的可能是具体实现方式,你们说的不是一个方面的东西。感觉没必要吵了,没有从共识开始谈。
|
60
gBurnX 2021-03-21 04:01:19 +08:00 1
@sunriz 唉...他们根本没仔细看,我从没说这两把锁是一回事,我用词很严谨的,在 4 楼第一次表述是:数据库对操作系统层次的锁,进行了进一步的包装。
两个直接开骂的人,他们不仅没仔细看,而且你可以翻开他们的发言记录,各种骂街用词。 还有一个小伙伴,一开始不承认 os 锁的作用,后来又承认,自打自脸,还说我不懂误导人.. 无奈摊手...... |
61
patagonia111010 2021-03-21 17:41:32 +08:00
@gBurnX 你是个 S B 吗 ? block 了
|
62
leviathan0992 2021-03-21 17:44:39 +08:00
@gBurnX 你说的确实不对,不用给自己找补了, 任何并发系统都需要 mutex 的实现,但那不是楼主问的事务锁. 事务锁和 mutex 是两个东西. 看看这篇文章 https://leviathan.vip/2019/12/18/understand-mysql-intention-lock/#%E7%90%86%E8%A7%A3-lock-%E5%92%8C-latch
|
63
coderwl 2021-03-21 18:28:43 +08:00
看了上面战况激烈啊,我理解数据库的锁主要是逻辑层面的吧,实现方式很多种,比如乐观锁的实现,完全是比较版本号或者时间戳,跟操作系统锁没啥关系
|
64
gBurnX 2021-03-21 20:24:00 +08:00
@patagonia111010
你在 41 楼反对了我,骂我是蠢货。然后你没解释原因,也没给出更好的方案。 接着你在 56 楼,又一次否定我。这次你依然没解释原因,然后继续说我嘴犟+属驴。 你在 61 楼,直接骂我 S B,还 block 我。 嗯,我感觉在这个帖子,几个小伙伴教了我很多战斗词汇啊...我该感谢你们嘛? |
65
gBurnX 2021-03-21 20:29:09 +08:00
|
66
gBurnX 2021-03-21 20:31:39 +08:00
@coderwl
这位小伙伴,你有想法是很好的。但我建议你去做一次试试,就按照你的乐观锁的想法去做,你看看你写的 db 会不会用到 OS 提供的锁。 |
67
encro 2021-03-21 20:45:04 +08:00
普通应用场景:Mysql 手册 足矣; 实际开两个控制台试一下事务和锁,了解事务锁行,脏读之类你就超过 80%程序员了。
专业 DBA: 源码。看一遍,你就超过 95%程序员了。 |
68
encro 2021-03-21 20:51:31 +08:00
随便 google 下 mysql 锁。
前三条我都觉得可以: https://database.51cto.com/art/201910/604421.htm https://juejin.cn/post/6844903668571963406 https://learnku.com/articles/39212?order_by=vote_count& 剩下的就是自己动手试了。试了之后,如果想了解原理才去查找相关资料,然后再去看是不是要本书,或者研究源码。 |