指数是提高数据查询效率的数据结构。与本书目录类似,可以根据目录快速找到相关内容。
在MySQL 8.0版本中,InnoDB存储引擎支持的索引包括B+树索引,完整文本索引和R Tree索引。其中,B+树索引最广泛使用。
每个索引对应于Innodb.b+树索引特征中的B+树:基于磁盘的平衡树,树非常短,通常3到4层,因此访问效率很高,查询十个数据的数据数百万或数亿个数据,仅3或4次I/O。
假设我们有下表,ID是主要键,字段k具有索引:
主密钥索引和非媒体密钥索引的示意图如下:
其中,r代表整个线的价值。
主要密钥索引和非媒体密钥索引之间的区别是:
1.如果查询语句是
在查询主键的方法中,您只需要搜索B+树即可。
2.如果查询语句是
在非main键的查询方法中,您需要先搜索K索引树,获取ID = 100,然后一次搜索ID索引树。此过程也称为返回表。
database_name database name table table table name index_name index last_update统计信息最后更新时间stat station stat_name统计信息stat_value stat_value statistics信息sample_size sampling sampling smize size size supe state state state state state state state stater类型列表列表列表数据已分为sarmone.sesence.sessence.sessence。
如上图所示,桩表中的数据和索引分别存储。该指数是有序的,数据是无序的。索引的叶节点是桩表中数据的地址。桩表中的数据会更改,其位置会更改,这会导致索引中的地址更新,从而影响性能。
数据根据主要密钥排序存储在索引中,主密钥索引也称为群集索引。在索引组织表中,数据为索引,索引是data。innodb存储引擎就是这样的数据组织。
除了主键索引外,其他索引还称为第二级索引或非收集索引。它们也是B+树索引。它与主密钥索引不同。叶节点存储在索引钥匙值和主键值中。
当查询数据用于使用第二级索引时,主要键值将通过第二级索引找到,然后通过主键引入查询数据。第二个级别的索引通过主键索引再次调用。“
与桩桌相比,当数据更改时,不需要维护诸如索引组织表的第二级索引,除非修改主键,否则性能优势将非常明显。
如上所述,第二级索引的叶节点存储在索引钥匙值和主密钥值中。
例如,我们有下表:
能够点击名称索引,索引叶节点存储主键ID,并且可以通过名称索引树获得ID和名称。无需返回表。它符合指数覆盖范围,并具有很高的效率。
能够点击名称索引,索引叶节点存储了主键ID,但是必须将性字段返回查询以获取它。它不符合索引覆盖范围。有必要收集索引以再次通过ID值扫描代码获得性领域,并将降低效率。
从MySQL 5.7版本开始,MySQL开始支持创建函数索引(即,索引是函数表达式)。功能索引的两个主要用途:
如果我们有一个注册的日期字段register_date,并且已经创建了索引,那么现在有以下条件查询,那么我们可以点击索引吗?
答案不是。该索引仅由register_date的数据进行排序。它不会对date_format(register_date)进行排序,因此无法使用此索引。
我们可以使用函数索引来解决此问题并创建date_format(regission_date)的索引。
例如,下表:
移动列是一个虚拟列,该虚拟列是从以后的函数表达式计算得出的。该列本身不会占据任何存储空间,索引IDX_MOBILE本质上是函数索引。这是,当编写SQL时,您可以直接使用此虚拟列而无需编写冗长的函数:
B+树的索引结构可以使用索引的“大多数前缀”来定位记录。
例如,我们有高频字段的字段A和B。为了减少返回表,我们可以建立关节指数。目前,我们不需要单独建立索引。
但是,如果在查询条件下只有b句子,则不能使用此组合索引。目前,您必须维护另一个索引。如果A字段大于B字段,则可以创建这两个索引,否则创建了这两个索引。
让我们首先讨论结论:当保证不将商业代码写入重复数据中时,建议尽可能多地选择普通索引。
上述性能的差异很小。由于数据的读数不仅读取需要从磁盘中读取的数据,而且根据页面的读取和写入InnoDB的数据。查找和判断下一个记录”,只有一个指针查找和一个计算,当前CPU可以忽略操作成本。
唯一的索引更新不能用于更改缓冲区,并且可以使用普通索引
什么是变更缓冲区?
对于唯一的索引,当您更新时,您需要将数据页读取到内存,以确定它是否违反了唯一的约束。由于数据页面已在内存中读取,因此您自然不需要更改缓冲区;普通索引是,普通索引是它是,普通索引是它,但是普通索引是,但普通索引是,但普通索引是common Index.RECORD更新对更改缓冲区的更新。到磁盘io的高成本,最好使用更改缓冲区更友好的性能。
复合索引是指由多个列组成的B+树索引。
对于组合索引(a,b),因为它已经对A和B列进行排序,因此可以通过此索引优化的SQL是:
无法达到索引(a,b)排序(b,a),因此无法优化以下SQL:
如果查询字段位于第二级索引的叶节点中,则可以直接返回结果而无需返回表。通过组合索引避免回报表的优化技术也称为覆盖索引。
使用包含多列特征的组合索引可以实现索引覆盖技术并改善SQL的查询性能。