由于开始学习mysql索引的知识点,所以汇总了下比较全的自己觉得说明的比较详细的文章以及自己的一些总结:

首先了解到索引有哪些种类,每种索引底层使用的数据结构是哪些:

1.索引方法:

FULLTEXT(全文索引):全文索引又叫倒排索引,底层结构是由辅助表和关联数组来实现;

mysql反向索引 mysql 倒叙索引_mysql 链表类型

https://www.baidu.com/link?url=x7X_yLA5F82JCRJtynlXrfq32omLiiiVrv00zakUBeONqvKdmexGjffX7ztlB_8zmBb7olRPBdC9ZdbVDgmU8q&wd=&eqid=ebe6a2f70011bb83000000065fad3096www.baidu.com

哈希索引:哈希索引的底层结构就是链表加数组了,这个大家应该都比较熟悉;

B+-树索引:该类索引的结构如名字一样,是B+树;

RTREE索引:又叫空间数据索引,一般用于myISAM,主要用于高维的数据查找,数据结构是R树,下面是介绍R树的博客链接

2.索引类型:

首先了解下什么是非聚集索引,什么是非聚集索引:

聚集索引基于数据行的键值在表内排序和存储这些数据行。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。

每个 InnoDB 表都有一个称为聚簇索引的特殊索引, 其中存储了行的数据。所以,如果你的表没有主键,在创建表的时候,你可以设置某一字段为唯一索引UNIQUE,这样它将成为这个表的聚簇索引,如果既没有主键,也没有唯一索引,则mysql将创建一个隐藏的聚簇索引。

所以所有的索引都可以分为聚集索引和非聚集索引两类;

然后再详细说一下索引类型:

普通索引:仅加速查询

唯一索引:加速查询 + 列值唯一(可以有null)

主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个

组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并搬运工大雄

mysql反向索引 mysql 倒叙索引_mysql反向索引_02

而在组合索引中,我们又需要了解到最左匹配原则的知识点

mysql反向索引 mysql 倒叙索引_mysql反向索引_03

ps.索引合并,使用多个单列索引组合搜索;

说到这里还有一个知识点就是回表(重点,因为会影响到性能问题)

除了主键索引在叶子节点中存有所有该行的所有数据,其他索引的叶子节点只存有该索引的数据和主键的值,所以如果用主键索引以外的索引进行查询,可能会需要回表;借用上面其中一篇博客的知识点举个例子:

sql1:select * from tb_student where class_id=834
sql2:select id from tb_student where class_id=834

id是主键,classid是其中的列;所以这里在第一个sql里面就需要回表,因为先用class_id的索引找到了主键,然后再用主键索引去找该主键的所有数据,所有需要回表;而第二条sql当然就不需要回表了;

这里就又会涉及到索引覆盖(又可以叫覆盖索引):

覆盖索引,select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖

如有不同想法或补充的,各位大牛多多评论!!!