MySQL索引锁与事务
Posted yishanchuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL索引锁与事务相关的知识,希望对你有一定的参考价值。
mysql索引、锁与事务
引子
总结一些自己的理解,作为备忘。
MySQL索引
先说说索引吧。数据库需要完成数据的存储、查找、修改等操作。
存储
MySQL默认一个数据页大小是16KB(可以改为32KB等大小),而操作系统一个数据页(段页式)是4KB,MySQL放大四倍的目的在于尽量减少磁盘IO(用户检索范围查询比较多,而一次IO过程中,一页或两页的时间代价接近,约小于10ms),参照局部性预读原理。
查找与修改
这是数据库的核心功能之一,经常在面试中遇到。
在学习数据结构时,常用三种数据结构:顺序数组、哈希表、二叉树,如下图所示:
- 顺序数组:查找利用二分查找法达到 O(log(N)) 的时间复杂度,对范围查询支持也很好,但是插入的时候如果不是在数组尾部,就需要摞动后面所有的数据,插入数据的时间复杂度为 O(N)
- 哈希表:通过一个特定的哈希函数将 key 值转换为一个固定的地址,然后将对应的 value 放到这个位置,如果发生哈希碰撞,就用链地址法解决冲突(JDK8 用红黑树记录冲突节点,参考HashMap的实现)。由于哈希函数的离散特性,所以经过哈希函数处理后的 key 将失去原有的顺序,所以哈希结构的索引无法满足范围查询,只适合等值查询的情况例如一些缓存的场景
- 二叉树:在极端情况下会变成线性结构,也就是每个节点都只有左子节点或者只有右子节点,这样就无法利用二分查找只能从第一个节点开始向后遍历了
- 平衡二叉树:为了维持 O(log(N)) 的时间复杂度,我们需要在插入节点的时候对节点进行调整以保证树的平衡,所以平衡二叉树插入的时间复杂度也是 O(log(N))
- 平衡多叉树:二叉树只有两个子节点,如果数据量很大则树就很高,树的每一层一般不在同一个数据块中存储,为了尽量的减少磁盘读写次数,我们用N叉树来代替二叉树,在 MySQL 中这个N一般为 1200 ,这样树高是 4 的话也可以存储亿级别的数据,而且树的前面两层一般都在内存中
- B+树: MySQL innoDB存储引擎与myISAM存储引擎中用到的 B+ 树,如下图所示。前者一般用非叶子节点构建索引,而叶子节点用来存储具体的值,所以称为聚簇索引;后者叶子节点存储的是数据的地址,所以又称为非聚簇索引。聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引则不同;聚簇索引能够提高多行检索的速度,而非聚簇索引则对单行的检索速度很快
分析一下B+树的性质:
- IO次数取决于树的层高H,假设当前表的数据总量是N,数据块大小是M,则H=log(M+1)*N。在常规场景下,假设N不变,数据块越大,树的层高越低,MySQL中层高一般是4左右。
- 最左前缀匹配原则。这是非常重要的性质,尤其在组合索引的使用。
在这两大类的索引类型下,还可以将索引分成四个小类:
1,普通索引:最基本的索引,没有任何限制,是我们大多数情况下使用到的索引。
2,唯一索引:与普通索引类型,不同的是唯一索引的列值必须唯一,但允许为空值。
3,全文索引:全文索引(FULLTEXT)仅可以适用于MyISAM引擎的数据表;作用于CHAR、VARCHAR、TEXT数据类型的列。
4,组合索引:将几个列作为一条索引进行检索,使用最左匹配原则。
锁
以上是关于MySQL索引锁与事务的主要内容,如果未能解决你的问题,请参考以下文章