![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
MySQL45讲
weixin_Akian
这个作者很懒,什么都没留下…
展开
-
第十二讲-讲为什么我的MySQL会“抖”一下
为什么我的MySQL会“抖”一下?当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。抖动的时候应该是在刷脏页:第一种场景是,粉板满了,记不下了。这时候如果再有人来赊账,掌柜就只得放下手里的活儿,将粉板上的记录擦掉一些,留出空位以便继续记账。当然在擦掉之前,他必须先将正确的账目记录到账本中才行。这个场景,对应的就是InnoDB的redo log写满了。这时候系统会停止所有更新操作,把checkpoint往前推原创 2021-07-07 19:41:13 · 173 阅读 · 1 评论 -
第十一讲-怎么给字符串字段加索引
怎么给字符串字段加索引?1.直接创建完整索引,这样可能比较占用空间;2.创建前缀索引,节省空间,但会增加查询扫描次数,并且不能使用覆盖索引;3.倒序存储,再创建前缀索引,用于绕过字符串本身前缀的区分度不够的问题;4.创建hash字段索引,查询性能稳定,有额外的存储和计算消耗,跟第三种方式一样,都不支持范围扫描。在实际应用中,你要根据业务字段的特点选择使用哪种方式。作者提问:如果你在维护一个学校的学生信息数据库,学生登录名的统一格式是”学号@gmail.com", 而学号的规则是:十五位的数字,原创 2021-07-07 18:58:26 · 219 阅读 · 0 评论 -
第十讲-讲MySQL为什么有时候会选错索引
MySQL为什么有时候会选错索引?扫描行数是怎么判断的?MySQL在真正开始执行语句之前,并不能精确地知道满足这个条件的记录有多少条,而只能根据统计信息来估算记录数。这个统计信息就是索引的“区分度”。显然,一个索引上不同的值越多,这个索引的区分度就越好。而一个索引上不同的值的个数,我们称之为“基数”(cardinality)。也就是说,这个基数越大,索引的区分度越好。mysql采用的采样统计采样统计的时候,InnoDB默认会选择N个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引原创 2021-07-07 16:37:42 · 83 阅读 · 0 评论 -
第九讲-讲普通索引和唯一索引,应该怎么选择
普通索引和唯一索引,应该怎么选择?查询过程对于普通索引来说,查找到满足条件的第一个记录(5,500)后,需要查找下一个记录,直到碰到第一个不满足k=5条件的记录。对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索。性能相差不大。更新过程第一种情况是,这个记录要更新的目标页在内存中。这时,InnoDB的处理流程如下:对于唯一索引来说,找到3和5之间的位置,判断到没有冲突,插入这个值,语句执行结束;对于普通索引来说,找到3和5之间的位置,插入这个值,语句执行结原创 2021-07-07 16:03:04 · 64 阅读 · 0 评论 -
第八讲-讲事务到底是隔离的还是不隔离的
讲事务到底是隔离的还是不隔离的这个要看隔离级别;对于可重复读,查询只承认在事务启动前就已经提交完成的数据;对于读提交,查询只承认在语句启动前就已经提交完成的数据;作者提问:现在,我要把所有“字段c和id值相等的行”的c值清零,但是却发现了一个“诡异”的、改不掉的情况。请你构造出这种情况,并说明其原理。mysql> CREATE TABLE `t` (`id` int(11) NOT NULL,`c` int(11) DEFAULT NULL,PRIMARY KEY (`id`)) E原创 2021-07-07 14:57:10 · 100 阅读 · 0 评论 -
第七讲-讲行锁功过:怎么减少行锁对性能的影响
怎么减少行锁对性能的影响?1.如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。因为所有的操作需要的行锁都是在事务提交的时候才释放的,如果你把最可能造成锁冲突、最可能影响并发度的锁尽量往后放,那么这一行的锁时间就最少。这就最大程度地减少了事务之间的锁等待,提升了并发度。2.解决死锁问题。对于死锁有两种策略:一种策略是,直接进入等待,直到超时。这个超时时间可以通过参数innodb_lock_wait_timeout来设置。另一种策略是,发起死锁检测,发现死锁后,主动回原创 2021-07-07 11:21:15 · 171 阅读 · 0 评论 -
第六讲-讲全局锁和表锁:给表加个字段怎么有这么多阻碍
如何安全地给小表加字段?1.首先我们要解决长事务,事务不提交,就会一直占着MDL锁。在MySQL的information_schema 库的 innodb_trx 表中,你可以查到当前执行中的事务。如果你要做DDL变更的表刚好有长事务在执行,要考虑先暂停DDL,或者kill掉这个长事务。2.但考虑一下这个场景。如果你要变更的表是一个热点表,虽然数据量不大,但是上面的请求很频繁,而你不得不加个字段,你该怎么做呢?3.这时候kill可能未必管用,因为新的请求马上就来了。比较理想的机制是,在alter ta原创 2021-07-06 14:39:42 · 67 阅读 · 0 评论 -
第三讲-事务隔离:为什么你改了我还看不见-问题分析
本讲问题:为什么你改了我还看不见这个与不同的隔离级别有关。读未提交:你的修改即使未提交也可以看到读已提交:你的修改未提交我是看不到的,你如果提交的话,即使处于不同事务,我也可以看到。可重复读、可串行化:你的事务提交了,我还处在另外一个事务时,是看不到你的修改的,这是事务的隔离性。作者提问:你现在知道了系统里面应该避免长事务,如果你是业务开发负责人同时也是数据库负责人,你会有什么方案来避免出现或者处理这种情况呢?这个问题,我们可以从应用开发端和数据库端来看。首先,从应用开发端来看:确认是否使原创 2021-07-04 22:37:32 · 88 阅读 · 0 评论 -
第四讲-讲深入浅出索引(上)
本讲问题:为什么你改了我还看不见这个与不同的隔离级别有关。读未提交:你的修改即使未提交也可以看到读已提交:你的修改未提交我是看不到的,你如果提交的话,即使处于不同事务,我也可以看到。可重复读、可串行化:你的事务提交了,我还处在另外一个事务时,是看不到你的修改的,这是事务的隔离性。作者提问:你现在知道了系统里面应该避免长事务,如果你是业务开发负责人同时也是数据库负责人,你会有什么方案来避免出现或者处理这种情况呢?我觉得需要采用显示开启事务的方式启动事务。在开发过程中,尽可能的减小事务范围,少原创 2021-07-04 21:08:08 · 68 阅读 · 0 评论 -
第二讲-日志系统:一条SQL更新语句是如何执行的-问题分析
本讲问题:一条SQL更新语句是如何执行的1.首先你需要连接到这个服务器,这时候与你交互的是连接器。连接器负责与客户端建立连接、获取权限、维持和管理连接。2.查询缓存(MySQL8.0删掉了这个功能)3.如果没有命中缓存,那么就要开始真正执行语句。分析器需要对你的SQL语句做解析,判断你输入的SQL语句是否满足SQL语法。4.经过了分析器,MySQL还需要对你的SQL语句进行优化,这时候涉及到的就是优化器,选择成本最小的执行计划。5.最后就是执行器,分析器告诉你要做什么,优化器告诉你应该怎么做,而执原创 2021-07-04 20:16:33 · 79 阅读 · 0 评论 -
第一讲-基础架构:一条SQL查询语句是如何执行的-问题分析
本讲问题:一条SQL查询语句是如何执行的1.首先你需要连接到这个服务器,这时候与你交互的是连接器。连接器负责与客户端建立连接、获取权限、维持和管理连接。2.查询缓存(MySQL8.0删掉了这个功能)3.如果没有命中缓存,那么就要开始真正执行语句。分析器需要对你的SQL语句做解析,判断你输入的SQL语句是否满足SQL语法。4.经过了分析器,MySQL还需要对你的SQL语句进行优化,这时候涉及到的就是优化器,选择成本最小的执行计划。5.最后就是执行器,分析器告诉你要做什么,优化器告诉你应该怎么做,而执原创 2021-07-04 17:09:11 · 62 阅读 · 0 评论