45 | 自增id用完怎么办?
45 | 自增id用完怎么办?
讲述:林晓斌
时长17:07大小15.65M
表定义自增值 id
InnoDB 系统自增 row_id
Xid
Innodb trx_id
thread_id
小结
赞 134
提建议
精选留言(222)
- 克劳德2019-02-25本人服务端工程师,在学习这门课之前数据库一直是我的短板,曾听朋友说MySQL或数据库中涉及了很多方面的知识点,每一个拿出来展开讲几乎都能出一本书了,对数据库是越来越忌惮,同时也因为工作上并没有过多接触,水平便一直停留在编写简单SQL层面。 在面试中被问到数据库问题,只能无奈的说这块不太清楚,也曾在网上自学过,但网上的文章知识点比较零散,很多都是给出一些结论性的观点,由于不了解其内部原理,记忆很难深刻。 老实说,当初报这门课的时候就像买技术书籍一样,我相信大家都有这样的体会,以为买到了就等于学到了,所以有一段时间没有点开看过,以至于后面开始学的时候都是在追赶老师和大家的进度,唯一遗憾的地方就是没能跟老师及时留言互动。 这门课虽然是文字授课,但字里行间给我的感觉就是很亲切很舒服,为什么呢,因为老师可以把晦涩的知识变得通俗易懂,有时我在思考,如果让我来讲一个自己擅长的领域是否也能做到这一点,如果要做到的话需要什么样的知识储备呢。 最后真要感谢老师的这门课,让我从心里不再惧怕数据库问题,不管是工作还是面试中信心倍增,现在时不时都敢和我们DBA“切磋切磋“了,哈哈。 祝好~展开
作者回复: 👍“切磋切磋“ 留言不会“过时”哈,在对应的章节下面提出相关的问题,我会持续关注评论区
共 5 条评论164 - 张珂2019-06-19我觉得是这样的,人的记忆是结构化的。 如果用纯文字做读书笔记,那么一段时间之后,再来看笔记,还得根据文字重建该结构。 倒不如直接看结构化的读书笔记,省去大脑再次重建的繁琐过程。 真是文不如表,表不如图,图不如动画啊。 下面是我的《MySQL实战》的PPT形式的读书笔记,如果想复习,就快速浏览PPT,就能快速重建记忆。 https://github.com/zhangkekf/reading-notes/tree/master/MySQL%E5%AE%9E%E6%88%98 目前才更新到了39小节,当然会持续更新,如果有时间会做成动画。再次感谢林老师!展开
作者回复: 这也太棒了吧,👍
共 25 条评论142 - 夜空中最亮的星2019-02-25不知道是最后一篇,否则的话就慢些读完了; 我是一名运维,公司也没有DBA,所以MySQL库也归我收拾; 读了老师的专栏,操作起数据库来,心情更好了; 老师的课,让我有了想看完《高性能MySQL》的兴趣; 听了老师的课,开发都来问我数据库的问题了,高兴; 老师你会有返场吗?我猜会 😄 可否透漏下接下来的安排,会有续集吗?进阶吗? 不想这一别就是一生。 您的从未谋面的学生。展开
作者回复: 谢谢你 “开发都来问我数据库的问题了”,当年我也是这么开始“入坑”,加油
58 - Continue2019-02-25跟着学了三个多月,受益匪浅,学到了很多新的知识和其中的原理!
作者回复: 早🤝
55 - 钱2019-08-10第一遍到今天就结束了,感谢老师的辛勤付出。 专栏的买的多,怕这个太长没时间学别的,也怕它太短让人意犹未尽。看评论的数量和质量,就能清晰的分辨一个专栏的优劣,老师的这个无疑是佼佼者中的佼佼者。 这个专栏学起来好像看《少年包青天》一样, 提出问题——谁是问题的凶手 分析问题——寻找问题的凶手 解决问题——找出问题的凶手 总结问题——记录抓住问题凶手的始末 真是精彩绝伦,我们程序员都是问题的终结者,发现问题、解决问题、总结问题是我们的责任。老师的指导,让我们的见识和技能得到了提升,这样便能解决更多的问题创造更多的价值。 而且我觉得技术的存在也是为了解决各种问题的, 数据库——解决数据存储的问题 WAL——解决数据一致性问题 多线程——解决性能差异的问题 锁——解决多线程并发导致数据不一致的问题 索引——解决数据查询或者操作慢的问题 日志——解决数据备份、同步、恢复等问题 数据库主备——解决数据高可用的问题 数据库读写分离——解决数据库压力的问题 数据库分库分表——解决数据量大的问题 从简单到复杂,解决一个问题就会引入一些新的问题,然后再想办法解决新的问题,事情就变得越来越复杂啦!但主体没变,附加值在一直增加,并且衍生出了许多新的东西,东西一多就需要分一下类,否则很难理解。所以,数据库按公司有分类,按存储引擎特点有分类,按功能特点有分类等等。 它的核心就是存储数据,剩下的就是怎么操作舒服怎么操作快的问题啦!想必其他工具也是如此?展开
作者回复: 赞总结能力
共 2 条评论48 - 某、人2019-02-26很遗憾没能坚持到最后,但是也很庆幸能遇到这么好的专栏。以前了解mysql都是一些零散的知识点,通过学习完专栏,不论是mysql整体架构还是基础的知识点,都有了更深的认识。以后就把老师的文档当官方文档查,出现问题先来看看专栏。 感触特别深的是,老师对于提到的每一个问题,都会严谨又认真的去回答,尽量帮助每一位同学都能有所收获。要做到这一点,是特别耗费精力的。 感谢老师的传道授业解惑,希望以后有机会能当面向老师请教问题。期待老师下一部杰作展开
作者回复: 刚过完年都是很忙的, 找时间补上哈,等你的评论区留言^_^
31 - zapup2020-07-27和朋友开玩笑说: - 以前用 mysql 觉得常用的功能都够用就行了 - 看了《高性能mysql》后,了解了一些原理知识觉得更稳了,面试也不怕了 - 专栏学到一半时,再也不敢跟人说「我会 MySQL」 跟下来半个月了,酣畅淋漓,茅塞顿开 信息量巨大,配图的笔记都有90+页,明天开始复习,值得多刷 再次感谢林老师与幕后编辑工作者的辛勤付出!展开共 7 条评论28
- MrVito2019-09-04一度想放弃,一度又再拿起,看到这里如释重负,一刷刷到28讲,就停了,因为当时感觉总是没跟上,心浮气躁,二刷从第一讲又开始刷,一个月我就刷完了,而且还能看得懂,对于一个小白来说不容易,曾经留言想放弃,没想到,晓斌老师竟然留言回我叫我加油,当时老脸一红,硬着头皮,再刷一次。而后,也坚持回答问题,虽然回答不怎么样,有时候看了评论,感觉大神太多了,真的,路漫漫兮及其修远兮,我欲上下而求索。谢谢老师,以后面试MySQL的问题我都不会怎么害怕了,遇到不懂的问题我就回来看,回来刷,成长在于点滴,细水才能长流。始终养得根深,枝繁叶茂。展开
作者回复: 👍 坚持不易
20 - 三胖2019-02-25老师,我才学了四分之一的课程,但是这门课已经更新完了,我是直接跑到最后一节技术篇来留言的!很想知道,后来者比如我在学到后面的课程时遇到问题留言,老师还会看会回复吗?(老师的课程超值!!)
作者回复: 会看的 后台系统是按照留言时间显示的 而且我在这事情上有强迫症,一定会让“未处理问题”变成0的😆 只是说如果是其他同学评论区问过的问题,我可能就不会重复回复了
17 - inrtyx2020-04-06我都看了五遍了,每次都有收获。期待老师出新的作品。
作者回复: 👍🤝
共 2 条评论15 - 东青2019-02-25当前系统并无其他事务存在时,启动一个只读事务时(意味没有事务id),它的低高水位是怎么样的老师。
作者回复: 假设当前没有其他事务存在,假设当前的max_trx_id=N, 这时候启动一个只读事务,它的高低水位就都是N。
共 4 条评论12 - IceGeek172019-02-25感谢老师,课程受益匪浅, 课程结束后,如果有问题,是继续在这里的评论区提问,还是会有另外一条答疑通道? 另外,在第35篇我提了几个问题,老师还没有回答,我这里再贴一下,老师看一下 问题一: 对于BKA算法的流程理解,用文中的例子,先把t1表(小表)中查询需要的字段放入join_buffer, 然后把join_buffer里的字段值批量传给t2表,先根据索引a查到id,然后得到一批主键id,再根据主键id排序,然后再根据排完序的id去主键索引查数据(这里用到MRR) 理解是否正确? 这里对于主键id排序是在哪里做的,是在join_buffer里,还是另外再开辟一块临时内存?如果在join_buffer里,那join_buffer里的每行内容是不是:t2.id + t1查询必须的字段,并且join_buffer里是根据id排序的? 问题二: 虽然MySQL官方没有支持hash join,但是之前看到文章说,MariaDB已经支持hash join,能不能后续在答疑文章中简单总结下mariaDB支持的join算法 问题三: 在实际项目中,一个比较困惑的问题,看到过这样的类似写法: select xxx from t1 join t2 on t1.id = t2.id for update (目的是获取几个表上最新的数据,并且加上锁,防止数据被更新) 这里有几个问题: 1) 像这样 join + for update,表上的加锁规则是怎么样的?是不是在需要join的两个表上根据具体的查询执行过程都加上锁? 2)像这样 join + for update 的用法是否合理?碰到这样的场景,应该怎么去做? 问题四: 看过阿里输出的开发手册里,强调 “最多不超过三表join”,实际项目中,给我感觉很难做到所有业务都不超过三表join,那这里的问题就是,有什么相关的经验方法,可以尽量降低参与join的数据表? 比如,在数据表里添加冗余字段,可以降低参与join的数据表数量,还有什么其他好的方法?展开
作者回复: 就在我们评论区,提跟文章相关的内容,会继续关注。 问题一、前面的过程理解正确,MRR过程用的是read_rnd_buffer 问题二、其实我们文中最后那个过程,你把他设想成在MySQL内部执行。。 问题三、这种复杂的语句,你要把我们两部分知识点连起来看。一个原则:for update的话,执行语句过程中扫到的间隙和记录都要加锁。 当然最好是不这么做,拆成两个语句会好些。 问题四、还是我文中的建议,如果都用NLJ或BKA算法的join其实还好,所以看看explain。 降低join表数量的方法,基本上行就是冗余字段和拆成多个语句这两个方向了
11 - 发条橙子 。2019-02-25作为开发 一开始对于数据库的知识就是大学那一些 ,等到毕业后(17年毕业)实际开发中就使用到了增删改 , 对于事务之类的知识全都差不多忘记 , 随着项目开发深知降低数据库压力的重要性 。 于是开始上网找数据库相关的书来看 , 从 深入理解innodb 、 高性能MySQL 、索引设计与优化 。 有些知识很深 ,没有人指导对于理解也可能造成了偏差 。 几本书挑着章节看完了,但是总感觉差些什么,很多知识都没发和生产中联系起来 。 这时候老师的课程出来了 ,没有犹豫直接下单。跟着老师一点点学 , 不但把之前的知识全部串了起来。之前比较难理解的知识点全部打通 ,甚至有些理解有偏差的知识点都被纠正过来 。 每个问题都被老师翻牌耐心的解答更是增加了学习的动力 ,非常的感谢老师,老师真的很认真的对待这个专栏 整个专栏从开始到结束没想到时间过的这么快,甚至还有些不舍哈哈哈 。有很多心情言语不能表达 , 同在杭州不知以后会不会有机会见到老师呢哈哈哈哈展开
作者回复: 👍 你在评论区的留言也给提升了专栏质量哦😆,还记得有一篇的内容里面直接用了你评论的内容
11 - 天夙2020-04-23时隔一年,为了找工作二刷而且认认真真的看完了,真的是收获太多了,谢谢老师!10
- DBRE2019-02-27低版本thread_id超过2^32-1后,在general log显示是负数,高版本貌似没有这个问题,是否高版本的thread_id是8字节呢?
作者回复: 主要不是定义的问题,而是打印的时候代码问题,按照这个代码输出的: "%5ld ", (long) thread_id 是个bug, 超过2^31就变成负数了, 新版本改了 好问题😆
10 - shawn2019-02-25受益匪浅,最后几讲还想了解下null值如何建立索引,由于null直接不能比较和排序,MySQL能区分出每一个null值吗
作者回复: 可以,因为普通索引上都有主键值对吧, 所以其实是 (null, id1), (null, id2) ....
10 - ArtistLu2019-03-08相遇恨晚😆,安慰下自己,种树的最好时机是十年前,其次是现在!!!谢谢老师
作者回复: 🤝
9 - 长杰2019-02-26感谢老师,通过本课程的学习,加深了mysql原理上的理解,特别是间隙锁,nextkeylock,join操作上,事物的一致性以及binlog和redolog的配合。感觉还意犹未尽,希望后续还能在这里和老师互动,为我们答疑解惑,再次感谢老师!
作者回复: 会的, 也感谢你们一路相伴🤝
9 - hal2019-06-21老师好,我是一个刚毕业的实习生,这是我买的第一个专栏,感觉质量非常非常高,老师的功底真的太深厚了,而且真的能解决线上的问题,前两天客户有个主从延迟了2天多,当时同事慌得不行,当时参考老师之前第23篇文章和第26篇文章 环境:MySQL5.7.24 (1)打算在主库把下面两个参数调高,增加同时处于prepare阶段的事务,来提高主库并发度 binlog_group_commit_sync_delay binlog_group_commit_sync_no_delay_count (2)以及取消双1,用安全性换性能,因为在从库设置,只是为了追上主库 sync_binlog=0 innodb_flush_log_at_trx_commit=0 当时做的选择只有(2)因为主库正在跑虽然是测试环境,也不太敢动手,但是根据老师的文章感觉上事可以提高并发性能的。结果就是在5分钟之内,,,Seconds_Behind_Master从187986到0了,可以说感觉很舒服了, 不过解决之后也有一点疑问,如下: a. (2)中的两个参数对主从延迟优化有这么明显吗,感觉太明显了我有点慌 b. 如果在从库设置(1)中的2个参数,是不是也能提高从库执行sql的效率,通过减少写binlog的写盘效率, c.是不是在从库追上主的时候(2)两个参数就需要设置为0,不然会由于等待的逻辑从库会有"追不上"主库的假象 最后祝老师身体健康,天天开心,准备二刷巩固知识,感谢老师的辛苦付出!展开
作者回复: 👍 能解决到问题太好了 是这样的,如果是磁盘的io能力不行,修改这两个参数,效果就特别明显。 如果还有类似的场景,你可以先看系统的ioutil,如果从库的io利用率特别高,那改这两个参数确实可以达到很好的效果。 === 从你描述的这个场景看,方案1可能就没什么效果了(延迟还可能变大哦)。 方案1主要是提升主库性能,对从库没影响的
7 - Smile2019-02-25首先感谢老师几个月的讲解,原本一些离散的知识通过学习专栏,都串起来了。希望老师后面再出专栏。 另外针对 max_trx_id的bug,有一个疑问: 假设事物都提交了,后续的新的事物 从 0开始增长, 不应该也都和新的一样了么(就象一个新的mysql),只有处于那种边界的事物(快要溢出前,还没有提交的事物)才会出现这个问题吧。 望老师解答。展开
作者回复: 不会, 因为max_trx_id定义是8个字节,超过2^48之后还会继续涨; 只是写到数据里面的trx_id是取最低6个自己,才看上去是从0开始的
8