MySQL实战45讲 / 从原理到实战,丁奇带你搞懂MySQL
林晓斌
网名丁奇,前阿里资深技术专家
 
  • 课程目录
  • 课程介绍
  • 开篇词 | 这一次,让我们一起来搞懂MySQL

    我希望这个专栏能够激发开发者对数据库原理的探索欲,从而更好地理解工作中遇到的问题,更能知道背后的为什么。

  • 01 | 基础架构:一条SQL查询语句是如何执行的?

    今天我给你介绍了MySQL的逻辑架构,希望你对一个SQL语句完整执行流程的各个阶段能有一个初步的印象。

  • 02 | 日志系统:一条SQL更新语句是如何执行的?

    今天这篇文章,主要介绍了MySQL里面最重要的两个日志,即物理日志redo log和逻辑日志binlog。

  • 03 | 事务隔离:为什么你改了我还看不见?

    我介绍了MySQL的事务隔离级别的现象和实现,根据实现原理分析了长事务存在的风险,以及如何用正确的方式避免长事务。

  • 04 | 深入浅出索引(上)

    今天这篇文章,介绍了引擎的数据结构模型,帮助你理解MySQL为什么选择B+树结构来存储数据。同时,这篇文章还分析了是否使用自增主键的原因和选择策略。

  • 05 | 深入浅出索引(下)

    在满足语句需求的情况下, 尽量少地访问资源是数据库设计的重要原则之一。我们在使用数据库的时候,尤其是在设计表结构时,也要以减少资源消耗作为目标。

  • 06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?

    今天,我跟你介绍了MySQL的全局锁和表级锁。

  • 07 | 行锁功过:怎么减少行锁对性能的影响?

    今天,我和你介绍了MySQL的行锁,涉及了两阶段所协议、死锁和死锁检测这两大部分内容。

  • 08 | 事务到底是隔离的还是不隔离的?

    普通查询语句是一致性读,一致性读会根据一致性视图来决定数据版本的可见性。

  • 09 | 普通索引和唯一索引,应该怎么选择?

    我从普通索引和唯一索引的选择开始,和你分享了数据的查询和更新过程,然后说明了change buffer的机制以及应用场景,最后讲到了索引选择的实践建议。

  • 10 | MySQL为什么有时候会选错索引?

    今天,我要和你聊聊索引统计的更新机制,以及优化器选错索引了应该如何处理。

  • 11 | 怎么给字符串字段加索引?

    在今天这篇文章中,我跟你聊了聊字符串字段创建索引的场景。

  • 12 | 为什么我的MySQL会“抖”一下?

    我延续第2篇中介绍的WAL的概念,和你解释了这个机制后续需要的刷脏页操作和执行时机。利用WAL技术,数据库将随机写转换成了顺序写,大大提升了数据库的性能。

  • 13 | 为什么表数据删掉一半,表文件大小不变?

    今天这篇文章,我和你讨论了数据库中回收表空间的方法。

  • 14 | count(*)这么慢,我该怎么办?

    今天,我和你聊了聊MySQL中获得表行数的几种方法。

  • 15 | 答疑文章(一):日志和索引相关问题

    我针对前14篇文章,大家在评论区中的留言,从中摘取了关于日志和索引的相关问题,串成了今天这篇文章。

  • 在线阅读:直播回顾 | 林晓斌:我的 MySQL 心路历程

    在专栏上线后的11月21日,我来到极客时间做了一场主题是“我的MySQL心路历程”的直播。今天,我特意将这个直播的回顾文章,放在了专栏下面。

  • 16 | “order by”是怎么工作的?

    今天这篇文章,我和你介绍了MySQL里面order by语句的几种算法流程。

  • 17 | 如何正确地显示随机消息?

    今天这篇文章,我是借着随机排序的需求,跟你介绍了MySQL对临时表排序的执行过程。

  • 18 | 为什么这些SQL语句逻辑相同,性能却差异巨大?

    今天我给你举了三个例子,其实是在说同一件事儿,即:对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。

  • 19 | 为什么我只查一行的语句,也执行这么慢?

    今天我给你举了在一个简单的表上,执行“查一行”,可能会出现的被锁住和执行慢的例子。这其中涉及到了表锁、行锁和一致性读的概念。

  • 20 | 幻读是什么,幻读有什么问题?

    今天我们从上一篇文章的课后问题说起,提到了全表扫描的加锁方式。我们发现即使给所有的行都加上行锁,仍然无法解决幻读问题,因此引入了间隙锁的概念。

  • 21 | 为什么我只改一行的语句,锁这么多?

    这些加锁规则我没在别的地方看到过有类似的总结,以前我自己判断的时候都是想着代码里面的实现来脑补的。这次为了总结成这个规则,我又重新刷了代码。

  • 22 | MySQL有哪些“饮鸩止渴”提高性能的方法?

    今天这篇文章,我以业务高峰期的性能问题为背景,和你介绍了一些紧急处理的手段。

  • 23 | MySQL是怎么保证数据不丢的?

    今天这篇文章,我着重和你介绍的是MySQL是“怎么保证redo log和binlog是完整的”。

  • 24 | MySQL是怎么保证主备一致的?

    今天这篇文章,我给你介绍了MySQL binlog的格式和一些基本机制,是后面我要介绍的读写分离等系列文章的背景知识,希望你可以认真消化理解。

  • 25 | MySQL是怎么保证高可用的?

    在实际的应用中,我更建议使用可靠性优先的策略。毕竟保证数据准确,应该是数据库服务的底线。在这个基础上,通过减少主备延迟,提升系统的可用性。

  • 26 | 备库为什么会延迟好几个小时?

    在今天这篇文章中,我和你介绍了MySQL的各种多线程复制策略。

  • 27 | 主库出问题了,从库怎么办?

    如果你使用的MySQL版本支持GTID的话,我都建议你尽量使用GTID模式来做一主多从的切换。

  • 28 | 读写分离有哪些坑?

    在今天这篇文章中,我跟你介绍了一主多从做读写分离时,可能碰到过期读的原因,以及几种应对的方案。

  • 29 | 如何判断一个数据库是不是出问题了?

    今天,我和你介绍了检测一个MySQL实例健康状态的几种方法,以及各种方法存在的问题和演进的逻辑。

  • 30 | 答疑文章(二):用动态的观点看加锁

    今天这篇文章,我用前面第20和第21篇文章评论区的几个问题,再次跟你复习了加锁规则。并且,我和你重点说明了,分析加锁范围时,一定要配合语句执行逻辑来进行。

  • 31 | 误删数据后除了跑路,还能怎么办?

    今天,我和你讨论了误删数据的几种可能,以及误删后的处理方法。但,我要强调的是,预防远比处理的意义来得大。

  • 32 | 为什么还有kill不掉的语句?

    在今天这篇文章中,我首先和你介绍了MySQL中,有些语句和连接“kill不掉”的情况。

  • 33 | 我查这么多数据,会不会把数据库内存打爆?

    今天,我用“大查询会不会把内存用光”这个问题,和你介绍了MySQL的查询结果,发送给客户端的过程。

  • 34 | 到底可不可以使用join?

    今天,我和你介绍了MySQL执行join语句的两种可能算法,这两种算法是由能否使用被驱动表的索引决定的。而能否用上被驱动表的索引,对join语句的性能影响很大。

  • 35 | join语句怎么优化?

    今天,我和你分享了Index Nested-Loop Join(NLJ)和Block Nested-Loop Join(BNL)的优化方法。

  • 36 | 为什么临时表可以重名?

    今天这篇文章,我和你介绍了临时表的用法和特性。

  • 37 | 什么时候会使用内部临时表?

    通过今天这篇文章,我重点和你讲了group by的几种实现算法,并总结了一些使用的指导原则。从中,我还和你一起分析了MySQL什么时候会使用内部临时表的问题。

  • 38 | 都说InnoDB好,那还要不要使用Memory引擎?

    今天这篇文章,我从“要不要使用内存表”这个问题展开,介绍了Memory引擎的几个特性,并和你分享了Memory引擎的适用场景。

  • 39 | 自增主键为什么不是连续的?

    今天这篇文章,我从“自增主键为什么会出现不连续的值”这个问题开始,和你讨论了自增值的存储、修改机制、修改时机,以及自增锁的优化。

  • 40 | insert语句的锁为什么这么多?

    insert语句是一个很轻量的操作。不过,这个结论对于“普通的insert语句”才有效。为什么这么说?今天,我要跟你介绍的就是几种insert语句的特殊情况。

  • 41 | 怎么最快地复制一张表?

    今天这篇文章,我和你介绍了三种将一个表的数据导入到另外一个表中的方法,分别是:mysqldump方法、导出CSV文件方法,以及物理拷贝方法。

  • 42 | grant之后要跟着flush privileges吗?

    今天这篇文章,我和你介绍的是MySQL用户权限在数据表和内存中的存在形式,以及grant和revoke命令的执行逻辑。

  • 43 | 要不要使用分区表?

    这篇文章,我主要和你介绍的是server层和引擎层对分区表的处理方式。

  • 44 | 答疑文章(三):说一说这些好问题

    在我看来,能够帮我们扩展一个逻辑的边界的问题,就是好问题。

  • 45 | 自增id用完怎么办?

    今天这篇文章,我给你介绍了MySQL不同的自增id达到上限以后的行为。

  • 在线阅读:结束语 | 点线网面,一起构建MySQL知识网络

    在我的理解里,介绍数据库的文章需要有操作性,每一个操作有相应的原理,每一个原理背后又有它的原理,这是一个链条。

限时拼团¥79,立省¥20,点击拼团按钮,立即加入

特别放送

1.学完《MySQL实战45讲》后,我都收获了些什么? ——用户故事精选 2.林晓斌(丁奇):我的 MySQL 心路历程 3. MySQL中6个常见的日志问题

数据库是一个综合系统,其背后是发展了几十年的数据库理论。也许你会觉得数据库并不难,因为你可以熟练地写出SQL,也可以在各个客户端里玩得游刃有余。但就以最常见的MySQL为例,作为程序员,你在使用MySQL的过程中,是不是曾经遇到过类似的问题:

  1. 为什么我的count(*)这么慢?

  2. 为什么我建了索引,却根本没有效果?

  3. 为什么我只查一行的语句,也执行这么慢?

  4. MySQL对于大表要怎么优化?

之前,你大概都是通过搜索别人的经验来解决问题。你有没有想过,如果能够理解MySQL的工作原理,那么在遇到问题的时候,是不是就能更快地直戳问题的本质?比如说,知道了索引的实现原理,那遇到索引问题的时候,你是不是就能从原理的角度,推断可能的解决方案?

本专栏将会以实战中的常见问题为切入点,带你剖析现象背后的本质原因。更重要的是,本专栏还将通过几条主线为你串起各个零散的知识点,再由线到面带你构建MySQL知识体系。

林晓斌,网名“丁奇”,前阿里资深技术专家,曾负责阿里云RDS内核开发团队和运维团队,并推动了AliSQL分支开源。作为活跃的MySQL社区贡献者,丁奇专注于数据存储系统、MySQL源码研究和改进、MySQL性能优化和功能改进,热衷于解决MySQL疑难问题。

在这个专栏里,丁奇将会结合自己十多年来通过MySQL源码找答案的经历,和你分享一条高效的学习路径,旨在给你一个从理论到实战的系统性指导,让你少走弯路,彻底搞懂MySQL。

专栏模块

专栏共45期,包括两大模块。

模块一,基础篇。为你深入浅出地讲述MySQL核心知识,涵盖MySQL基础架构、日志系统、事务隔离、锁等内容。

模块二,实践篇。将从一个个关键的数据库问题出发,分析数据库原理,并给出实践指导。每个问题,都不只是简单地给出答案,而是从为什么要这么想、到底该怎样做出发,让你能够知其所以然,都将能够解决你平时工作中的一个疑惑点。

专栏详细目录如下:

你觉得怎么样?期待您评价: