码迷,mamicode.com
首页 > 数据库 > 详细

MySQL索引、锁与事务

时间:2020-07-24 16:14:37      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:复杂   允许   http   次数   inno   系统   基本   myisam   lock   

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+树的性质:

  1. IO次数取决于树的层高H,假设当前表的数据总量是N,数据块大小是M,则H=log(M+1)*N。在常规场景下,假设N不变,数据块越大,树的层高越低,MySQL中层高一般是4左右。
  2. 最左前缀匹配原则。这是非常重要的性质,尤其在组合索引的使用。

在这两大类的索引类型下,还可以将索引分成四个小类:
1,普通索引:最基本的索引,没有任何限制,是我们大多数情况下使用到的索引。

2,唯一索引:与普通索引类型,不同的是唯一索引的列值必须唯一,但允许为空值。

3,全文索引:全文索引(FULLTEXT)仅可以适用于MyISAM引擎的数据表;作用于CHAR、VARCHAR、TEXT数据类型的列。

4,组合索引:将几个列作为一条索引进行检索,使用最左匹配原则。

MySQL索引、锁与事务

标签:复杂   允许   http   次数   inno   系统   基本   myisam   lock   

原文地址:https://www.cnblogs.com/yishanchuan/p/13371755.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!