网站建设的能力,第一媒体app最新版本,某网站seo诊断分析,机关网站建设方案Mysql的索引详解1.索引定义2.索引结构2.1数据结构分析2.1.1熟知的数据结构2.1.2分析为什么这么多的数据结构不全适用于索引结构2.2Hash结构2.3B tree结构3.索引分类3.1聚集索引#xff08;聚簇索引#xff09;3.2非聚集索引#xff08;稀疏索引#xff09;3.3联合索引3.4主…
Mysql的索引详解1.索引定义2.索引结构2.1数据结构分析2.1.1熟知的数据结构2.1.2分析为什么这么多的数据结构不全适用于索引结构2.2Hash结构2.3B tree结构3.索引分类3.1聚集索引聚簇索引3.2非聚集索引稀疏索引3.3联合索引3.4主键索引和非主键1.索引定义
索引是mysql帮我们排好序的数据结构可以更快捷的查找数据
2.索引结构
2.1数据结构分析
2.1.1熟知的数据结构
hash二叉树红黑树B-tree
2.1.2分析为什么这么多的数据结构不全适用于索引结构
二叉树其中二叉树有个众所周知的问题就是容易形成“歪脖子”树形成类似链表的结构查询速度很慢。红黑树红黑树对二叉树做了优化保证了左子树和右子树的均衡不会出现歪脖子树但是缺点是层级太深不适合作为mysql的索引结构索引的查找方式会在下面进行分析
索引的查找方式索引结构实际上存储在磁盘上的文件中mysql根据索引定位每定位一个位置后都需要加载到内存中然后在查找下一层级如果层级很深就需要进行多次磁盘io而这个操作是很耗时的。
总结排除掉二叉树和红黑树后适合作为索引结构就是hash结构和B-tree
但是实际上mysql的索引结构使用的是Btree,这里就需要说明B-tree和Btree的区别了。 B-tree和Btree的区别
非叶子节点不存储数据只存储索引因为叶子节点有全量的索引非叶子节点存储的为冗余索引这样可以在非叶子节点的层级放更多的索引。叶子节点包含所以的索引叶子节点使用指针链接提高了区间的访问能力
针对上面说的非叶子节点存储更多的索引做解释 我们知道mysql在加载索引时一个磁盘页的大小为16k,如果非叶子节点存储数据那么它的大小就远远大于只存储索引时的大小。所以如果非叶子节点只存储索引数据那么一个磁盘页加载的索引数据就更多减少了磁盘加载次数这样可以优化mysql的查询效率。
2.2Hash结构
hash结构有个好处就是查找的时候只需要对key进行一次hash运算就能算出存储位置。但是也存在这很多问题比如hash冲突以及sql中的范围查询。所以一板情况下我们不是hash结构建立索引。
2.3B tree结构
Btree结构可以很好的解决索引数据存储层级过深的问题而且相比与B-tree优化了每个磁盘页可加载的索引数量同时在叶子节点使用指针链接提高了区间的访问能力我们常用的索引结构就是Btree.
3.索引分类
3.1聚集索引聚簇索引
聚集索引实际上是一种文件存储方式索引文件和数据文件存储在一起称之为聚集索引 InnoDB存储引擎的索引和数据就存放在一个文件。 主键索引的叶子节点存储的就是响应的行数据
3.2非聚集索引稀疏索引
索引文件和数据文件分开存储称为非聚集索引 MyISAM存储引擎的索引文件和数据文件分开存储。 主键索引的叶子节点指向数据存储的位置通过主键索引定位到数据后需要再根据主键索引指向的位置加载相应数据
3.3联合索引
多列字段联合建立索引按照执行顺序一次排序。
3.4主键索引和非主键 非主键索引的叶子节点存储的是主键索引需要进行回表操作根据定位的主键索引在进行查询对应的行数据。 回表跨两个Btree查找数据我们称之为回表操作。
由此可以引发很多索引优化需要注意的地方比如可以通过二级索引直接查询的结果避免回表查询。假设联合索引为二级索引查询数据时使用覆盖索引所有查询字段在二级索引树就能获取到此时就直接在二级索引树查询结果返回另外二级索引树因为不存具体行数据索引比主键索引小因此效率也能更高