mysql
我不是攻城狮
越努力越幸运
展开
-
Innodb下修改事务工作流程(buffer pool、redo log、undolog、binlog)
undolog的写入最开始写到内存中的,然后由1个后台线程定时刷新到磁盘中的。Innodb优先从Buffer Pool中查询该条记录,如果没有就从磁盘文件中缓存到Buffer Pool中。binlog中记录的信息包括:事务开始的时间、数据库名、表名、事务ID、SQL语句等。提交事务后,后台异步线程将Buffer Pool写入磁盘中,这里会有一定的延时。同步修改到redo log buffer,此时并没有写入磁盘中。更新Buffer pool中的脏页,此时并没有写入磁盘中。4、写入redo log日志。原创 2024-02-16 15:01:45 · 200 阅读 · 0 评论 -
union和union all区别
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则排序;效率高 UnionAll:对两个结果集进行并集操作,包括重复行,不进行排序;效率低原创 2024-02-16 12:50:09 · 78 阅读 · 0 评论 -
truncate、delete、drop的区别?
不支持删除内容不支持。原创 2024-02-16 12:31:11 · 181 阅读 · 0 评论 -
mysql sql执行次序
from--->join--->where-->group by-->having-->select--->distinct--->order by --->limit原创 2024-02-16 11:18:24 · 114 阅读 · 0 评论 -
mysql like‘%xxx%‘优化
3、union联合使用虚拟队列进行查询。2、为虚拟列创建索引。原创 2024-02-12 21:51:00 · 215 阅读 · 0 评论 -
msyql主从延时优化
2、从库sql线程只有一个,当执行sql线程过程中,遇到复杂的sql语句的场景,可能会发生死锁可能。部署一台不对外提供查询的从节点,专门负责sql线程执行sql。3、从服务器机器性能一般。3、选择性能更好的机器。原创 2024-02-10 19:02:05 · 88 阅读 · 0 评论 -
msyql主从复制
1、主从复制开启,主库负责dump当前binlog日志(update、insert、delete),从服务器准备开启IO线程和sql线程。2、从库负责向主库发起连接,IO线程负责拉取主库的binlog日志并且同步到relay log日志。3、从服务器使用sql线程执行relay log里面的sql语句,并且持久化到从服务中。原创 2024-02-10 18:45:56 · 344 阅读 · 0 评论 -
binlog、undolog、redolog
binlog:适用于innodb和myisam引擎,用于数据备份、主从复制,保存所有的ddl和dml数据,以二进制进行存储。undolog:适用于innodb引擎,负责正常回滚事务、崩溃回滚事务,主要记录。redolog:适用于innodb引擎,负责崩溃恢复和数据持久化,主要记录执行。执行的sql,一旦事务需要回滚,直接执行事务发生前的sql语句。原创 2024-02-10 17:52:12 · 126 阅读 · 0 评论 -
limit深度分页和优化思路
先读取m+n条记录,然后抛弃前面n条记录,返回从m开始n条记录,深度分页越往后性能越差。3、再度优化提升思路,加入order by ,走联合索引。1、定义一个自增序列,一个子查询将所有的自增id全部查出。参考oracle rowsnumber分页思路。假设查询商品数量、商品名称等。原创 2024-02-10 17:25:13 · 215 阅读 · 0 评论 -
count(1)、count(*)、count(字段)区别
count(1)、count(*),没有区别,直接查询符合条件的行数(不管有没有null值)。count(字段)查询符合条件不为空的行数。原创 2024-02-10 15:11:43 · 90 阅读 · 0 评论 -
聚簇索引、非聚簇索引、回表、索引下推、覆盖索引
发生在联合索引,多个字段进行联合索引的时候,遵循最左匹配原则,只是在索引上进行匹配,也就是说不会产生回表,通常发生在like语句,查询计划,Using index condition就是索引下推技术。覆盖索引发生在联合索引,where条件遵循最左匹配原则,order by条件需要满足联合索引所有条件,否则产生回表,这个IO消耗非常大。经验:优化mysql的时候,当遇到至少百万级表的数据的情况下,通过减少回表次数来优化sql语句是一种常用的手段之一,只要保证正确使用联合索引那么效率自然不会低下。原创 2024-02-10 14:03:43 · 182 阅读 · 0 评论 -
mysql RR、RC隔离级别实现原理
采用乐观锁实现,它通过对不同事务生成不同的快照版本,通过UNDO版本链进行管理并且在MVCC里面,规定了高版本能够看到低版本的事务变更,低版本看不到高版本的事务变更,从而实现了不同事务之间的数据隔离。是一种特殊的表级别锁。简言之,如果一个事务正在往表中插入记录,所有其他事务的插入必须等待,以便第一个事务插入的行, 是连续的主键值。写锁,给事务加上排它锁,该事务可以执行任意读写操作,其他事务无法获取该排它锁,也不能加其他类型的锁。保证并发场景下,使用RC高过RR,RC的锁的粒度是只有一行,RR是多行的锁。原创 2024-02-09 08:43:47 · 800 阅读 · 0 评论 -
分库分表方案
通常情况下,当我们对order表进行分表的时候,比如我们要分成128张表的话,那么得到的128表应该是:order_0000、order_0001、order_0002.....order_0126、order_0127。比如表中有一万条数据,我们拆分为两张表,id 为奇数的:1,3,5,7……放在 user1 中, id 为偶数的:2,4,6,8。这就是分表算法要做的事情了,但是不管什么算法,我们都需要确保一个前提,那就是同一个分表字段,经过这个算法处理后,得到的结果一定是一致的,不可变的。原创 2023-04-12 14:45:44 · 567 阅读 · 0 评论 -
mysql in和exist区别,以及优化
假设子表数据量大,外表数据量小。优先使用exist。假设子表数据量小,外表数据量大。exist优先查询外表,再查子表。优化原则:数据量小的表驱动数据量大的表。in优先查询子表,再匹配外表。原创 2023-04-07 16:02:09 · 312 阅读 · 1 评论 -
mysql 平衡二叉树、B树、B+树,基础数据结构为什么选B+树
mysql底层采用B+树的数据结构,页索引16KB,全部存储到B+树的非叶子节点上,16KB全是索引数据,相对于B树存储键值对而言,能够存储更多的数据。(2)子节点数:非叶节点(根节点和枝节点)的子节点数 >1、且子节点数量<=M 、且M>=2,空树除外(注:M阶代表一个树节点最多有多少个查找路径,M=M路,当M=2则是2叉树,M=3则是3叉);(4)所有叶子节点均在同一层、叶子节点除了包含了关键字 和 关键字记录的指针外,也有指向其子节点的指针只不过其指针地址都为null对应下图最后一层节点的空格子。原创 2023-04-07 15:45:52 · 60 阅读 · 0 评论 -
Mysql事务ACID和隔离级别
解决方法:通过事务隔离级别去解决,以下四个隔离级别需要对应的数据库引擎自己支持,而不是spring本身去支持,spring只是整合使用而言。虚读/幻读:当前事务中,同一条sql,多次查询,前后结果记录数不一致,有可能多了,也有可能少了。脏读和不可重复读的区别:脏读读到的是未提交的数据,而不可重复读读到的是已经提交的数据。不可重复读和虚读/幻读的区别:不可重复读侧重于修改,虚读/幻读侧重的是新增/删除。脏读:当前事务可以读到另一个事务未提交的数据。原因:并发事务导致的脏读,不可重复读,幻读。原创 2020-03-09 03:58:32 · 453 阅读 · 1 评论 -
mysql索引失效
索引失效场景原创 2020-03-13 16:16:54 · 481 阅读 · 0 评论 -
mysql Innodb锁机制
乐观锁相对悲观锁而言,它认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回错误信息,让用户决定如何去做。1、RR会同时出现间隙锁和临建锁的死锁场景,可以使用RC来代替,另外RR级别锁的种类要超过RC锁,所以各方面对比下可以使用RC会占优。记录锁、间隙锁、临建锁(记录锁和间隙锁的组合),给索引(主键索引、唯一索引、普通索引)上锁。介于行锁和表锁中间,粒度一般、加锁开销一般、死锁发生几率一般、并发一般。只要不是给索引记录上锁,就是表锁。原创 2020-03-13 14:25:24 · 316 阅读 · 1 评论