首页 > 编程语言 >InnoDB存储引擎:索引与算法

InnoDB存储引擎:索引与算法

时间:2022-10-14 19:36:25浏览次数:53  
标签:存储 聚集 索引 算法 InnoDB Cardinality 节点

InnoDB存储引擎索引概述

InnoDB支持以下几种常见的索引:

  1. B+ 树索引 (传统意义上的索引,这是目前关系型数据库系统中查找最为常用和最为有效的索引;B+ 树索引并不能找到一个给定键值的具体行,能找到的只能是被查找数据行所在的页
  2. 全文索引 (将存储于数据库中的整本书或整篇文章中的任意内容信息查找出来的技术)
  3. 哈希索引 (自适应,InnoDB存储引擎会根据表的使用情况自动为表生成哈希索引,不能人为干预是否在一张表中生成哈希索引;哈希索引只能用于搜索等值查询

B+ 树索引

B+ 树索引的本质就是B+ 树在数据库中的实现,其有个特点为高扇出性。

数据库中的B+ 树索引可分为:

  1. 聚集索引
  2. 辅助索引

聚集索引与辅助索引不同的是,叶子节点存放的是否是一整行的信息。

聚集索引

聚集索引:叶子节点中存放的即为整张表的行记录信息。

由于实际的数据页只能按照一棵B+ 树进行排序,因此每张表只能拥有一个聚集索引。

如果聚集索引必须按照特定的顺序存放物理记录,则维护成本显得非常之高;所以聚集索引的存储并不是物理上连续的,而是逻辑上连续的;聚集索引还一个好处就是对于主键的排序查找和范围查找速度非常快。

辅助索引

辅助索引也成为非聚集索引,叶子节点并不包含行记录的全部数据。

下图为辅助索引与聚集索引的关系:

在这里插入图片描述

InnoDB存储引擎的辅助索引的书签就是相应行数据的聚集索引键。

辅助索引的存在并不影响数据在聚集索引中的组织,因此每张表上可以有多个辅助索引。

Cardinality 值

先看一下表中索引的信息:

在这里插入图片描述

  1. table:索引所在的表名
  2. Non_unique:非唯一的索引(0表示唯一;1表示不唯一)
  3. Key_name:索引的名字
  4. Seq_in_index:索引中该列的位置
  5. Column_name:索引列的名称
  6. Collation:列以什么方式存储在索引中
  7. Cardinality:索引中唯一值的数目的估计值
  8. Sub_part:是否是列的部分被索引(这里显示100,表示只对b列的前100字符进行索引;如果索引整个列,那么就为 NULL)
  9. Packed:关键字如何被压缩(NULL表示未被压缩)
  10. Index_type:索引的类型
  11. Comment:注释

Cardinality 值非常关键,表示索引中不重复记录数量的预估值

数据库对于 Cardinality 的统计都是通过采样的方法来完成的。

采样过程如下:

  1. 取得 B+ 树索引中叶子节点的数量,记为 A
  2. 随机取得 B+ 树索引中的 8 个叶子节点(默认InnoDB存储引擎对8个叶子节点进行采样),统计每个页不同记录的个数,即为 P1,P2,...,P8
  3. 根据采样信息给出 Cardinality 的预估值:Cardinality = (P1 + P2 + ... + P8) * A / 8

由于是随机选取了 8 个叶子节点,故而每次得到的 Cardinality 值可能是不同的;当表的叶子节点数小于等于 8 时,那么每次得到的 Cardinality 值就相同了。

B+ 树索引的使用

  1. 联合索引:对表上的多个列进行索引(避免多次的排序操作
  2. 覆盖索引:从辅助索引中得到查询的记录,不需要查询聚集索引中的记录(辅助索引不包含整行记录的所有信息,故其大小远小于聚集索引,因此可以减少大量的IO操作

Multi-Range Read 优化

MySQL5.6版本开始支持 MRR优化 ,该优化的目的就是为了减少磁盘的随机访问,并且将随机访问转化为较为顺序的数据访问

在这里插入图片描述

Index Condition Pushdown 优化

ICP优化同样是 MySQL5.6版本开始支持的一种根据索引进行查询的优化方式,当进行索引查询时,首先根据索引来查找记录,然后再根据 WHERE 条件来过滤记录。可以大大减少上层 SQL 层对记录的索取,从而提高数据库的整体性能

全文索引

InnoDB存储引擎从1.2.x版本开始支持全文检索的技术,其采用 full inverted index 的方式。

倒排索引

全文检索通常使用倒排索引来实现。其拥有两种表现形式:

  1. inverted file index,其表现形式为 { 单词,单词所在文档的 ID }
  2. full inverted index,其表现形式为 {单词, ( 单词所在文档的 ID,在具体文档中的位置 )}

标签:存储,聚集,索引,算法,InnoDB,Cardinality,节点
From: https://www.cnblogs.com/astralcon/p/16792748.html

相关文章

  • InnoDB存储引擎
    1.InnoDB体系架构1.1后台线程后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据;此外将已修改的数据文件刷新到磁盘文件,同时保证在数......
  • InnoDB存储引擎:事务
    认识事务概述事务:访问并更新数据库中各种数据项的一个程序执行单元。数据库引入事务的主要目的:事务会把数据库从一种一致状态转换为另一种一致状态。在数据库提交工作时......
  • 算法第四版习题解答(1.1 Basic Programming Model)
    前言使用的是《算法》第四版英文版,主要是习题解答。书中jar包的导入请戳:算法(第四版)中algs4.jar下载和使用EXERCISES1.1.11.1.21.1.3importjava.util.Scanner;p......
  • Elasticsearch——JavaApi实现索引管理
    版本不同版本的elasticsearch-rest-high-level-client和elasticsearch之间存在兼容风险,请确保和elasticsearch版本一致,否则会出现无法预计的错误。es配置maven依赖<dep......
  • MySQL索引(下)
    MySQL索引(下)该文摘抄自林晓斌老师的文章在上一篇文章中,介绍了InnoDB索引的数据结构模型,今天我们再继续聊聊跟MySQL索引有关的概念在开始这篇文章之前,我们先来看一下......
  • Python实战—基于KNN算法尾鸢花数据集分类
    KNN模型理论K最近邻分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中......
  • mysql创建索引的语句
     1. altertable table_name addindexindex_name(column) 2.altertabletable_nameaddprimarykey(column)/addunique主键索引或者唯一值索引 3.cre......
  • MySQL索引(上)
    MySQL索引(上)该文摘抄自林晓斌老师的文章索引是一种数据结构,索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。一本500页的书,如果你想快速找到其中的某一个知......
  • 1.0 Mysql索引的数据结构与算法
    索引是高效获取排序好的数据结构索引本身就是数据一部分关键信息,通过索引大大减少索引的数据量。索引信息需要额外的空间存储。创建和维护索引本身也会降低对数据的操作......
  • 深度学习算法工程师内心感悟
    某网友:数据放在第一位,成也数据,败也数据。深刻认识数据的重要性,把数据集维护好,数据量够了,再谈后面的模型优化,数据都不干净,用再好的模型,也不会出好的结果。启动开发前,多问......