MySQL索引

  • B+树索引
  • 自适应哈希索引(自动生成)

 

B+树索引:

MySQL索引_第1张图片

叶子节点会形成一个双向链表。

 

聚集索引:

按照每张表的主键构造一颗B+树(每张表只能有一个聚集索引),叶子节点是数据页。

注:B+树索引不能找到具体行(叶子节点为数据页),只能找到具体行所在的数据页,然后将数据页读入内存,按行查找具体行(二分)。

  • 聚集索引的存储-逻辑上连续,非物理上连续。(数据页双向链表,业内数据也是双向链表)
  • 范围查询很快。

 

非聚集索引:

辅助索引,叶节点不包含行的全部数据。除了包含键值,还包含一个书签。(指向对应行数据的聚集索引键,即主键)。

非聚集索引-离散读,不能很好的支持范围查找。

MySQL索引_第2张图片

 

堆表:数据按插入顺序存放。没有主键,索引都是非聚集的。

此时非聚集索引的书签是行标识符,如“文件号:页号:槽号”。

 

索引的创建和删除:

主键索引的创建和删除:需创建一张临时表,把数据导入临时表,删除原表,再将临时表重命名为原表名。需要很长时间。

辅助索引的创建:快速索引创建,对表加上一个S锁(表级锁)。创建过程中只能进行读操作。

辅助索引的删除:将辅助索引空间标记为可用。

 

辅助索引的优化使用:

InnoDB存储引擎会先从辅助节点的叶节点判断是否能得到所需的数据。

MySQL索引_第3张图片

MySQL索引_第4张图片

MySQL索引_第5张图片

辅助索引可以获取所需的所有数据,会优先走辅助索引。

如果要对字段a进行排序,会直接走主键索引。

MySQL索引_第6张图片

 

联合索引:

多列索引,B+树。

  • 多列索引 (a, b) ,select * from table where a = xxx,可以使用这个索引;select * from table where b = xxx不能使用这个索引 - 查询条件不包含前面的索引列只包含后面的索引列时,不能使用多列索引
  • 可以对第二个键值进行排序

 

自适应哈希索引:

使用散列表(Hash Table),InnoDB存储引擎自动创建。管理InnoDB缓冲池内存。

离散查找很快,范围查找效率不高。

直接寻址表:

MySQL索引_第7张图片

 

哈希表:

MySQL索引_第8张图片

对于缓冲池页的哈希表来说,在缓冲池中的page页都有一个chain指针,指向相同哈希值的页。

你可能感兴趣的:(mysql,存储引擎)