索引是一种数据结构,有助于通过辅助存储引擎有效地获得数据。
许多人说,索引是数据目录,它有助于发动机的快速定位数据。
我们经常从以下方面对索引进行分类
从“数据结构”的角度
从“物理存储”的角度来看,该索引被分类
来自“索引字段功能”的分类
类别从“字段到形成索引”
下表是MySQL Common Storage Engine InnoDB,Myisam和内存支持的索引类型:
在实际使用中,InnoDB是构建表时的默认存储引擎。
对于上表上的水平视图,您可以了解到B+树是MySQL中最多的索引类型。
尝试谈论B+树和哈希和红色黑树之间的区别。
B+Tree and B-Tree 1970,R.Bayer和E.McCreight提出了一棵平衡的多叉树 - B-Tree,磁盘管理系统中的目录管理,以及数据库中B-Tree的最大数据结构中的索引组织.DATA结构C语言版第二版Yan Weimin
B+树是B-Tree的一种变体。(哦,顺便说一句,B树读取B树,它不称为B Tree Bred Bred offuction ...)
B+树仅将数据存储在叶节点处,而B-Tree非叶子节点也存储数据。如果有任何疑问,可以连接到以下数据以插入数据测试。
因此,B+树的单节点的数量较小,并且可以在同一磁盘IO下查询更多的节点。
此外,B+树的叶子节点使用单个链接列表链接来检索MySQL中的公共范围中的基于方案的顺序搜索,而B Tree无法执行此操作。
B+树和红色黑树
对于带有n个叶子节点的B+树,搜索复杂性为“ O(logdn),d指B+树的程度。” MID-D值大于100。即使数据到达数据一千万级的水平,B+树的高度保持在3-4左右,确保可以找到目标数据3-4磁盘I/O。
从上图可以看出,红树和黑树是二进制树,节点的子节点的数量最多为2,这意味着其搜索复杂性为“ O(logn)”,这更高比B+树。目标数据所需的管理器的磁盘I/O更多。
B+树索引和哈希表范围查询是MySQL数据库中的一个常见场景,哈希表不适合示波器查询。哈希表更适合等效查询。此外,哈希表还存在诸如哈希功能选择和哈希价值冲突之类的问题。
由于这些原因,B+树索引的适用方案比哈希表索引更宽。
MySQL中的两个常用存储引擎与索引不同。
InnoDB的索引首先查看InnoDB存储引擎中的索引。根据叶子节点是否存储在整个表中,将InnoDB表的索引分为群集索引和第二级索引。
完整的表数据存储在群集索引中。
除集群索引以外的其他索引称为第二级索引。
以下两种类型的索引与实际示例一起引入。
我们当前的测试数据库创建了推销员信息的测试表
包含ID的三个字段(主键),名称,销售和指定表的存储引擎是InnoDB。
然后插入8个数据
在此示例中,工作表的集群索引基于字段ID
为了准确模拟,我们首先将主密钥ID插入B+树中以获取以下图
然后在这张照片上,我画了高清版本。
从图可以看出,群集索引的每个叶节点存储完整的表数据行。叶节点之间的一个路链接列表通过ID列连接,可以轻松检索。
InnoDB表要求必须有群集索引。默认情况下,在主密钥字段上创建群集索引。在没有主要密钥字段的情况下,将作为群集索引确定表的第一个非零件的唯一索引。前两个都是两者兼有。在没有情况下,InnoDB将自动生成一个隐藏的自我介绍ID列,并在此列上创建群集索引。
然后查看次要索引。
现在以工作桌为例
我们将第二个级别的索引添加到index_name到名称字段
同样,我们画了第二级索引索引索引的B+树原理图
可以在图中看到,第二级索引的叶节点不会存储完整的表数据行。相反,群集索引的值存储了,即工作表中的ID列的值。
B+树的程度设置为3个示意图中的3,主要是为了方便演示。
在实际的B+树指数中,树的程度通常大于100。
说到集群索引和第二级索引,我们必须提及“返回查询”。
由于第二级索引的叶节点不会存储完整的表数据,因此,当群集索引的列值由第二级索引查询时,还需要广告系列索引来进一步获得数据本身。
例如,我们想查询工人桌上名为lu guichen的人
通过名称='lu guichen'的条件
在辅助索引索引_NAME中找到主键ID = 8,然后带上ID = 8的条件
仅在群集索引查询进一步返回到集群索引查询之后才能获得。显然,退货表需要额外的B+树搜索过程,这将不可避免地增加查询时间。
应该注意的是,当第二级索引查询时,返回手表不是必要的过程。当所有查询字段都可以在第二级索引中找到时,就无需返回表。Mysql Sodor触发了“索引覆盖”。
此SQL仅查询ID和名称,第二个级索引已经包含查询所需的所有字段,因此无需返回表单。
使用解释查看此SQL执行计划
使用其中;使用索引显示查询触发了索引索引索引的索引覆盖范围,并且无需在此处返回表。
让我们在下面比较无索引的查询
额外意味着该索引将首先过滤。过滤索引后,找到满足索引条件的所有数据行,然后在Where子句中使用其他条件来过滤这些数据线。Index条件下推(ICP)是MySQL 5.6或更高版本中的新功能。这是一种使用索引过滤数据的优化方法。开启ICP时的执行计划包含使用索引条件标签,表明优化器使用ICP来优化数据访问。
如果您对此感兴趣,可以检查相应的官方文档和技术博客。
这次我们被简化为理解,并且不考虑ICP上数据访问的优化。关闭ICP时,索引只是访问数据访问的一种方法。
额外只是提醒我们,MySQL将使用条款来过滤结果集的位置。这通常发生在MySQL Server上,而不是存储引擎层。通常在无法进行索引扫描或索引时发生,但是某些查询条件不是在索引中。
在这里显示没有触发索引覆盖范围,并且执行还款查询。
Myisam的索引完成了InnoDB的索引,让我们看一下Myisam的索引
没有存储的群集索引,该仪表由Myisam存储引擎存储。
MyISAM表中的主要密钥索引与非MAIN密钥索引的结构相同。从上图,我们可以看到
他们的叶节点不是存储数据,表数据的地址存储在节点中,因此Myisam表可以没有主键。
Myisam表的数据和索引分开并分开存储。
MYISAM表中的主要密钥索引和非主要密钥索引之间的差异是,主密钥索引B+树的密钥必须满足主键的局限性。
非主要密钥索引B+树的键只能满足相应字段的特征。
“主钥匙索引”
“唯一的索引”
我们演示了创建索引
通过;顺序,我们看到了成功创建的三个独特索引。
一般索引的要求和一般索引的唯一索引必须为主要键或唯一字段。
在普通字段上构建的索引称为普通索引,该字段既不是主要键或字段。
前缀索引前索引是指字符类型字段的前几个字符或二进制类型字段的前几个字节建立的索引,而不是在整个字段上构建索引。
例如,您可以在人表中的人表中的名称的前5个字符上建立索引。
前缀索引可以在类型中构建
在列上,它可以大大减少索引所占据的存储空间,并且还可以提高索引的查询效率。
在我们的演示表格中演示联合索引的联合索引,以建立两个字段的联合索引,名称。使用Show Index命令查看索引的详细信息后,结果如下:
尽管详细信息中列出了两个条目,但这并不意味着联合索引是建立多个索引。关节指数是指数结构。这两个条目代表组合索引中字段的特定信息。在建立索引时按书面顺序按顺序进行。
同样,让我们看一下关节索引的B+树示意图
从图中,组合索引的非叶节节将两个字段的值保存为B+树的键值。当数据插入B+树上时,请根据字段ID.compare进行比较。