![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
mysql
灬晴
这个作者很懒,什么都没留下…
展开
-
mysql学习-10.explain执行计划
explain执行计划重要参数有id,type,key,rows,extra1.id 表示执行的顺序,id越大越先执行,id一样时从上往下执行。2.select_type 表示查询类型,通常有: simple:表示不需要union操作或者不包含子查询的简单查询。 primary:表示最外层查询。 union:union操作中第二个及之后的查询。 dependent union:union操作中第二个及之后的查询,并且该查询依赖于外部查询。 subqu...原创 2021-06-29 14:18:12 · 549 阅读 · 0 评论 -
mysql学习-9.如何正确的使用索引
1.索引的规则1.1.等值匹配假设索引(A) select * from table where A=xxx就是走索引的1.2.最左侧列匹配假设索引(A,B) select * from table where A=xxx and B=xxx就是走索引的而缺少A select * from table where B=xxx就是不走索引的,因为在B+树中是从A字段最先判断的如果想要走索引那么可以 select * from table where A in (穷举A的值) and B原创 2021-06-29 14:17:42 · 1317 阅读 · 0 评论 -
mysql学习-8.索引的数据结构
1.索引的基础概念大量插入数据的时候,会有一个数据页分裂的过程.其中的自增主键是从小到大依次排序的,所以每一次的插入都会伴随数据行从一个数据页挪动到另一个数据页.要快速从大量的数据页中找到一行数据,根据主键ID去和每一个数据页的第一行的主键ID做对比就知道这行数据到底是在哪一个数据页中.找到这个数据页之后只需要在这个数据页中遍历即可2.由双向链表演化到B+树一个大数据量的表中,那么他的主键必定是有很多的,那么他的主键的索引也是很多的.一条一条的索引就会组成一个索引页(生成相应的索原创 2021-06-29 14:17:12 · 100 阅读 · 0 评论 -
mysql学习-7.独占锁和共享锁
1.独占锁(防止脏写)独占锁叫做写锁并发事务修改一行数据时,会先判断这行数据是否有被加锁.如果未加锁就会添加一个独占锁,包含了自己的trx_id和状态和这行数据关联起来第二事务过来的时候判断到有锁了,那么他也加一个独占锁在后面排队只是状态是待执行的状态第一个事务执行完了之后就会检查这行数据是否有其他的锁.他会修改一个锁的状态让他进入执行状态2.共享锁共享锁叫做读锁去读取加了独占锁的值的时候,会自动执行mvcc的规则去undo中读他的快照版本共享锁是查询的时候可以添加的锁,原创 2021-06-29 14:16:35 · 530 阅读 · 0 评论 -
mysql学习-6.innodb下的mvcc版本控制
1.undo log版本链每一行数据都有两个隐藏字段 一个是trx_id(事务ID),一个是roll_pointer(指向执行事务之前的undo log中的旧值),那么在undo log中会形成一个版本链2.readview机制m_ids--记录生成readview的时候此刻还未提交的trx_id(事务ID)min_trx_id--m_ids中的最小值max_trx_id--是mysql下一个要生成的事务ID,最大事务ID.就是m_ids中最大的下一个creator_trx_原创 2021-06-29 14:15:34 · 74 阅读 · 0 评论 -
mysql学习-5.mysql中并发事务产生的问题
1.什么是脏读,脏写,不可重复读,幻读1.1.脏读和脏写实际上都是操作到了未提交的数据上导致的问题脏读:A事务在读取数据的同时,B事务在修改数据.而A事务读取到了B事务未提交的值,如果B事务回滚了,再次读取时就发现值被回滚了.脏写:A事务在写数据时,B事务也在写数据.A事务写在B事务的未提交版本上.B事务要反悔,所以回滚了.导致A事务也不明不白的回滚了.1.2.不可重复读在不会发生脏读的前提下,即读到的数据都是已提交的情况有一个事务A是连续不断的对一条数据进行查询,突然中间有事务原创 2021-06-29 14:15:03 · 116 阅读 · 0 评论 -
mysql学习-4.lru链表中的冷热数据处理
1.导致lru链表中热数据区被挤到尾部节点的可能原因由于mysql有预读的机制,会导致不是热数据的预读页会随着缓存页的读取会被放到lru链表的最头部还有mysql有全量扫描表的可能,也会导致大量本来属于热数据的缓存页会被挤到lru链表的最尾部预读机制中的值设置-- innodb_read_ahead_threshold 默认值是56 ,如果顺序的访问一个区内的数据页超过这个数量,就会触发预读机制,将下一个相邻区中的所有数据页都会加载到缓存页中-- innodb_random_read_a原创 2021-06-29 14:14:29 · 563 阅读 · 0 评论 -
mysql学习-3.free链表flush链表lru链表基本概念
这三个链表都是基于描述数据块的双向链表 他在buffer pool中占用的内存仅仅只是他的基础结点(40字节左右)1.free链表:buffer pool初始化完成后 将空白数据页的描述数据头尾连接起来2.flush链表:存储增删改之后的脏页3.lru链表:用来存储查询的页,常用的页会在头结点,不常用页会在尾节点.其中还有相应的一些lru的优化来处理预读页4.当缓存页用完的时候会触发lru链表最尾部和flush链表刷入磁盘...原创 2021-06-29 14:13:15 · 428 阅读 · 0 评论 -
mysql学习-2.buffer pool
1.为啥要使用buffer poolbuffer pool是基于内存的,可以在磁盘中加载一些数据进来,进行增删改操作.以此来减少了直接对磁盘的增删改的io操作,可以让增删改尽量在缓存中进行提升了性能buffer pool如何配置buffer pool默认值大小是128Minnodb_buffer_pool_size=xxx字节设置buffer pool为3G(为128的倍数) buffer pool块数为8mysqld --innodb_buffer_pool_size=3G -原创 2021-06-28 10:27:04 · 94 阅读 · 0 评论 -
mysql学习-1.mysql架构设计
1.mysql执行sql大致流程web容器中发起sql语句执行的请求->从数据库连接池中拿到连接->连接请求mysql中的sql接口->sql解析器进行sql语句的步骤解析->sql查询优化器进行sql语句的执行计划调优->sql执行器按照执行计划执行sql语句->sql执行器将执行任务交给存储引擎(InnoDb)->存储引擎拿到执行任务后 先从磁盘中加载被执行数据的缓存页数据到Buffer pool->然后生成一条undo原创 2021-06-28 10:26:09 · 80 阅读 · 0 评论