MYSQL中Innodb的整理(1)

MYSQL中Innodb的整理(1),第1张

MYSQL中Innodb的整理(1) MYSQL:

Innodb是款搜索引擎,存储数据的最小单位是page,大小为16kb。默认排序,影响插入,提高查询。

页的结构:

主键索引:

页目录里存两个数据,一个是每组里最小的值,一个是指针,用空间换时间;(就是方便目录找哪一章),为了减少遍历次数,可以利用二分查找可以优化查找(因为是顺序结构);插入的时候要与前面页进行调整,所以最好自增,不要用UUID。

页上面再新增一个主键,这就是B+树,但是MySQL下面的指针是双向的,这是为了查小于的情况

特点:每个节点有多条数据,并且数据有冗余,叶子节点(最下面一层)存放了所有数据。于是查找就分为全表扫描(从最后一页扫描)和走索引(从上往下按扫描)。但是如果查找的不是主键,就进行全表扫描。

联合索引:

第一个相同,下一个从小往大。联合bcd索引,即标红的,需要复制一份主键索引

缺点:复制所有一份数据浪费资源;改这里的数值,主键表的也要改,更新不方便;

所以这么设计(只记录联合索引的):

缺点是当select*是查找的数据不完整。

 

实际上:折中后:真正的在下面加一个主键信息,在根据主键索引找完整数据。

联合索引要遵循最左匹配原则。

Buffer Pool是innoble写出来的,默认128M,持久化后就会有一块空白页,buffer poll和磁盘之间有一个free链表指针指向的都是空白页。还有一个flush链表是管理在缓存时被修改了数据,就是脏页。

如果Buffer Pool里面的数据满了,就要进行淘汰链表最后的,即lru算法,淘汰用的少的,会多一个lru链表,新的放前面,因为越靠前越最近被访问;但是如果全盘扫描,会把整个Buffer Pool数据全替换调。所以分为热数据区域和冷数据区域(大小5:3),一开始都放冷数据最前面,那放到热数据区域的机制就是看两个访问页的时间间隔大于1秒的放热数据区域(解决全盘扫描的问题)。

  

 持久化时,磁盘有一个redo log空间,保存更新的数据,服务器中断后重启时会将原数据与redolog比较进行 *** 作

 innoDB结构:

索引是帮助MySQL高效获取数据的排好序的数据结构

索引数据结构:1.二叉树     2.红黑树       3.Hash表        4.B-Tree

 哈希索引只适用于单条数据查询,范围查询还是用B+树比较快;哈希索引不支持多列联合索引的最左匹配规则。

MySQL的隔离级别:

 1.读未提交:一个事务读到另一个未提交的事务修改的数据,产生脏读;

2.读已提交:产生不可重复读和幻读。

 不可重复读的重点是修改:同样的条件, 你读取过的数据, 再次读取出来发现值不一样了

幻读的重点在于新增或者删除:同样的条件, 第1次和第2次读出来的记录数不一样

当然, 从总的结果来看, 似乎两者都表现为两次读取的结果不一致.但如果你从控制的角度来看, 两者的区别就比较大

  • 对于前者, 只需要锁住满足条件的记录

  • 对于后者, 要锁住满足条件及其相近的记录

 

 每个事务修改时都有个事务ID,这叫事务链,select   readview里面有个m_ids存储活跃的事务ID

读已提交会把修改后提交的事务还认为是活跃的,而可重复读会把事务ID为200的修改给去掉。MVCC:多版本并发控制,解决了读并发;如果是通过加锁,会导致别人只是读数据也得等前一个事务释放锁才能读。

3.可重复读:解决了不可重复,但是还是会出现幻读(mysql帮解决了)。(默认级别)

4.串行化:可以进行读-读,但是不允许读-写,写-读的并发 *** 作

 真实存储的数据:

锁:

读已提交:只是对查(通过列的索引,包括主键,唯一索引,普通索引)出来的行加锁,可以插入数据

可重复度:插入数据会被阻塞(加了间隙锁,插都插不进去),解决幻读

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5691362.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存