MySQL索引种类简述

什么是索引?

索引是辅助存储引擎高效获取数据的一种排好序的数据结构。

索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

一、从数据结构类型角度分类

索引的数据结构类型和存储引擎有关,每种存储引擎所支持的索引数据结构类型可能有所差异。此处只列出两种简单了解,实际上能提高查询效率的数据结构不止这两种。

1、B+树索引

图1 B+树主体结构
MySQL索引种类简述_第1张图片
图2 叶子节点数据页
MySQL索引种类简述_第2张图片
B+树是在B-树基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+树实现其索引结构。
  • B+树的非叶子节点不存储data,只存储索引 key;
  • 只有叶子节点才存储 data;
  • B+树层级更少,I/O次数也会更少,查询速度更快;
  • B+树天然具备排序功能:B+树的叶子节点上使用双链表,便于查询大小区间的数据;
  • 数据页内的数据行之间使用单链表。

2、Hash 索引

  • Hash索引基于 Hash表实现,只有精确匹配索引所有列的查询才有效;
  • Hash索引的时间复杂度为 1,对等值查询速度非常快;
  • Hash索引只支持等值比较,如“=”“IN()”或“<=>”;
  • Hash索引不适合范围查询,且也存在哈希函数的选择与哈希冲突等问题;
  • 对索引列进行 Hash计算费时,相对 B+树索引来说,建立 Hash索引会耗费更多时间。

Hash 索引并不是最常用的索引数据结构类型,而我们的 InnoDB存储引擎也不支持手动创建 Hash 索引,但是支持自适应Hash索引。

InnoDB会自调优,如果满足创建 Hash索引的条件的话,InnoDB会自动创建 Hash索引,但条件比较苛刻。

什么是自适应Hash索引?

Innodb存储引擎会监控对表上二级索引的查找,如果发现某二级索引被频繁访问,二级索引成为热数据,建立哈希索引可以带来速度的提升,则自动建立哈希索引,称之为自适应哈希索引(Adaptive Hash Index,AHI)。

经常访问的二级索引数据会自动被生成到hash索引里面去(最近连续被访问三次的数据),自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快。

二、从索引字段特性/个数角度分类

  1. 普通索引
    (1) 最基本的索引类型,没有唯一性之类的限制;
    (2) 作用只是为了加快系统对数据的访问速度;
    (3) 允许空值、重复值。
  2. 唯一索引
    (1) 唯一索引是不允许其中任何两行具有相同索引值的索引;
    (2) 唯一索引与普通索引类似,不同的是创建唯一性索引的目的不是为了提高访问速度,而是为了避免数据出现重复;
    (3) 允许有空值。
  3. 组合索引
    (1) 由多个字段组成的索引叫组合索引,也称为复合索引或联合索引;
    (2) 一个组合索引实质上为表的查询提供了多个索引
    如:创建组合索引 (c1,c2,c3),相当于创建了 (c1),(c1, c2),(c1, c2, c3) 三个索引。
    注意如果不符合最左前缀原则,且也不符合覆盖索引,会导致索引失效
  4. 主键索引
    (1) 主键索引是唯一索引的特定类型,该索引要求主键中的每个值都唯一;
    (2) 不允许值重复或者值为空。
    创建主键索引通常使用 PRIMARY KEY 关键字。不能使用 CREATE INDEX 语句创建主键索引。
  5. 全文索引
    针对比较大的数据,如果要解决 like 查询效率低的问题,可以创建全文索引。
    (1) 全文索引主要用来查找文本中的关键字,只能在 CHAR、VARCHAR 或 TEXT 类型的列上创建。
    (2) 全文索引允许在索引列中插入重复值和空值。
    注意对于大容量的数据表,生成全文索引非常消耗时间和硬盘空间。

创建索引

  • 创建普通索引
    CREATE INDEX index_name ON table_name(col_name);
  • 创建唯一索引
    CREATE UNIQUE INDEX index_name ON table_name(col_name);
  • 创建普通组合索引
    CREATE INDEX index_name ON table_name(col_name_1, col_name_2);
  • 创建唯一组合索引
    CREATE UNIQUE INDEX index_name ON table_name(col_name_1,col_name_2);
  • 创建全文索引
    CREATE FULLTEXT INDEX index_name ON table_name(col_name);

修改表

ALTER TABLE table_name ADD INDEX index_name(col_name); // 添加索引
ALTER TABLE table_name DROP INDEX index_name; // 删除索引

创建表的时候指定索引

CREATE TABLE table_name ( […], INDEX [index_name] (col_name) );

删除索引

DROP INDEX [index_name] ON table_name;

查看索引

SHOW INDEX FROM table_name;

其他命令

DESC table_name; // 查看表结构
SHOW CREATE TABLE table_name; // 查看生成表的SQL

参考资料

[1] mysql常用的索引种类:https://www.cnblogs.com/lwcode6/p/11320795.html
[2] innodb引擎的4大特性:https://www.cnblogs.com/zhs0/p/10528520.html
[2] MySQL索引原理总结: https://mp.weixin.qq.com/s/XSFVAi_bBAWyAaDNadF5-g

你可能感兴趣的:(数据结构,java)