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.串行化:可以进行读-读,但是不允许读-写,写-读的并发 *** 作
真实存储的数据:
锁:
读已提交:只是对查(通过列的索引,包括主键,唯一索引,普通索引)出来的行加锁,可以插入数据
可重复度:插入数据会被阻塞(加了间隙锁,插都插不进去),解决幻读
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)