- 博客(10)
- 收藏
- 关注
原创 MySQL主从复制原理
在MySQL中,无论是复制还是备份恢复,依赖的都是全量备份和Binlog,全量备份相当于备份那一时刻的一个数据快照,Binlog则记录了每次数据更新的变化,也就是操作。与异步复制的区别:主节点收到客户端请求,必须在完成本节点日志写入的同时,还需要等待至少一个(设置为0个,那就是异步复制了)从节点完成数据同步的响应之后,才会响应客户端请求。:通过配置一定的复制机制,MySQL实现了跨主机的数据复制,从而获得一定的高可用能力,如果需要获得更高的可用性,只需要配置多个副本,或者进行级联复制就可以达到目的。
2026-02-10 14:48:01
33
原创 MySQL全局优化及8.0新特性
8.0之前,自增主键AUTO_INCREMENT的值如果大于max(primary key) + 1,在MySQL重启后,会重置AUTO_INCREMENT=max(primary key) + 1,这种现象在某些情况下会导致业务主键冲突或者其他难以发现的问题。假如有个联合索引idx_com(a,b,c),如果使用b和c字段作为查询字段,是无法使用索引的,那么这时候如果a字段的值不是很多,可以使用穷举的方法,将a的所有值写在where后面,以至于让a也参与到查询中,达到利用二级索引的目的。
2026-02-09 11:36:22
624
原创 MySQL InnoDB底层原理与MySQL日志机制
ROW:基于行的复制,记录每一行数据被修改的形式,然后在slave段再对相同的数据进行修改记录下每一行数据修改的细节,可以解决函数,存储过程在slave机器复制问题,日志量较大,性能较STATEMENT小。STATEMENT:基于SQL语句的复制,每一条SQL都会记录到master机器的bin-log中,性能高,但一些uuID(),sysdate()函数,同步到slave中时,值会跟master不一样。启用binlog记录功能,会影响服务器性能,如果需要恢复数据或主从复制功能,则好处则大于对服务器的影响。
2026-02-08 20:35:24
792
原创 MySQL锁机制、优化实践、MVCC底层原理
1)、先检查要修改的数据页是否在buffer pool中(空间较大,一般为内存的60%-70%,尽量让执行的SQL能在buffer pool中命中,减少从ibd文件中取数的次数,提高性能,命中率在99%以上才算正常,如果低了,可以考虑增大空间),不在buffer pool时,从ibd文件中加载某条数据的整页缓存数据到buffer pool缓存池,这是增删改查的直接操作的地方。更新buffer pool中的数据,变为“脏页”(和磁盘数据不一样),同时修改事务ID(db_trx_id)。
2026-02-07 14:51:54
600
原创 理解MySQL事务隔离级别和锁
当一个事务有多个修改语句时,就会涉及到多张表的修改,每张表都有一个自己的idb文件,事务提交时,多个修改都要从idb中获取数据,位置不确定,所以不能使用顺序写,只能随机获写,所以写入性能不高。表中每条数据还有两个隐藏字段,trx_id和roll_pointer,trx_id事务ID,roll_pointer回滚指针,指向undo log中的delete语句的地址,若事务回滚,则执行delete即可。级别越高事务隔离性越好,但性能越低,而隔离性是由MySQL的各种锁以及MVCC机制来实现的。
2026-02-06 10:40:36
1119
原创 MySQL索引优化再练习
步骤:把驱动表的数据扫描100次,读入到join_buffer(一块内存)中,然后扫描被驱动表,把被驱动表每一行取出来跟join_buffer中的数据作对比,扫描10000次,总共10100次,内存计算是100*10000 = 100万次,但是内存计算要快得多。说明:rows-预计需要扫描的行数,值越小越好,filtered-存储引擎返回数据后,经服务器Server层 WHERE 条件过滤后,剩余数据的百分比,越大越好,(过滤后剩余的行数 / 存储引擎返回的估算行数)*100%,最多100%。
2026-02-05 11:08:11
505
原创 MySQL索引优化练习
联合索引尽量覆盖条件,比如联合索引为proxince,city,sex,age字段,age字段一般是范围查询,age就最好放后面,如果中间有个字段(sex)不在查询条件中,可以使用 sex in ('femali',mali'),适用值少的字段,让age能延续上联合索引的前两个字段province和city。:一次性取出满足条件的所有字段,在sort buffer(占用空间大,内存压力小,默认1M大小)中进行排序,顺序度,一次性读取数据,效率高。前缀匹配查询,like 'abc%',能有效利用索引。
2026-02-04 09:46:18
845
原创 Explain的使用和索引解析
在覆盖索引树中找到所有符合条件的记录,无需回表,所有数据已全部在辅助索引的叶子节点中,直接从索引中返回所需要的数据。Using index:使用覆盖索引(通过索引就能查到结果集,不需要回表查询,就是覆盖索引),但它并不是索引,而是查询方式。index:扫描全索引就能拿到结果,一般是扫描某个二级索引(数据比主键索引的叶子节点的占用内存小(数量是一样的),所以比ALL快一些),这种扫描不会从索引树根节点开始快速查找,而是直接对二级索引的叶子节点遍历和扫描,速度比较慢,这种查询一般未使用覆盖索引。
2026-02-03 17:55:36
1144
原创 深入理解MySQL索引底层时间结构与算法
聚集索引(聚簇索引,主键索引),每张表只有一个,查询更快,不用跨文件,文件后缀:frm(form definition file),ibd(innodb data file)(有一个聚簇索引的情况下,又生成了一个非主键索引数据结构,查询的时候先去非主键索引结构中查询出ID,再去聚簇索引中查询完整记录)非叶子结点不存储data,只存储索引(冗余),16KB大小,1170个数据,相比带有data的B-Tree,它可以放更多的索引,也就能使高度更小。叶节点具有相同的深度,叶节点的指针为空(缺点),效率低。
2026-02-02 16:55:50
343
原创 熟悉MySQL架构
常见问题:连接过程比较复杂,通常采用连接池,尽量使用长连接,但是全部使用长连接后,内存占用上涨很快,因为长连接中的对象使用的临时内存一直未被及时释放,只有断开才会被释放,所以有被强行杀掉的风险,表象:MySQL异常重启了。情况2:先写binlog,后写redolog,崩溃恢复后这个事务无效,所以c=0,但是binlog记录了c=c+1了,所以使用binlog恢复的时候多出一个事务,c=1,与原库的值不同。基于同一个查询语句,决定使用哪个效率最高的查询方案(使用哪个索引,关联表时的连接顺序等)。
2026-02-01 15:11:31
396
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅