Mysql 索引学习笔记之分类
1 索引概述
2 索引分类
2.1 按结构
- BTREE 索引 : 最常见的索引类型,大部分索引都支持 B 树索引。
- HASH 索引:只有Memory引擎支持 , 使用场景简单 。
- R-tree 索引(空间索引):空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少,不做特别介绍。
- Full-text (全文索引) :全文索引也是MyISAM的一个特殊索引类型,主要用于全文索引,InnoDB从Mysql5.6版本开始支持全文索引。
注: 我们平常所说的索引,如果没有特别指明,都是指B+树(多路搜索树,并不一定是二叉的)结构组织的索引。其中聚集索引、复合索引、前缀索引、唯一索引默认都是使用 B+tree 索引,统称为 索引
MyISAM、InnoDB、Memory三种存储引擎对各种索引类型的支持
索引 | InnoDB引擎 | MyISAM引擎 | Memory引擎 |
---|---|---|---|
BTREE索引 | 支持 | 支持 | 支持 |
HASH 索引 | 不支持 | 不支持 | 支持 |
R-tree 索引 | 不支持 | 支持 | 不支持 |
Full-text | 5.6版本之后支持 | 支持 | 不支持 |
2.2 从物理存储角度
- 聚集(聚簇)索引(clustered index)
- 官方描述:The InnoDB term for a primary key index 。
- 翻译就是 InnoDB对主键索引的称呼 或者 主键索引的InnoDB术语
- 该索引中键值的逻辑顺序决定了表中相应行的物理顺序
- 聚集索引,叶子结点即存储了真实的数据行。所以通过聚集索引可以直接获取到数据库中的数据
- 一般在创建表的时候就会默认将主键设置为聚集索引
- 没有主键会自动创建一个的隐藏字段作为聚簇索引
- 官方描述:The InnoDB term for a primary key index 。
- 非聚集索引(non-clustered index)
- 也就是二级索引
- 可以创建,也可以不创建
- 普通索引和单列索引都是二级索引
2.3 从逻辑角度
- 主键索引 : 就是通过主键创建的索引,
- 普通索引或者单列索引: 即一个索引只包含单个列,一个表可以有多个单列索引
- 多列索引 (复合索引): 复合索引指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用复合索引时遵循最左前缀集合
- 唯一索引:就是字段内部数据唯一
- 空间索引:
- 空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON
- MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MYISAM的表中创建
- 前缀索引:
- 就是对文本的前几个字符(具体是几个字符在建立索引时指定)建立索引
- 网友 深蓝 对前缀索引的介绍
2.4 聚簇和非聚簇的区别
2.4.1 结构差异
- 聚簇:将数据和索引放在一起,按照一定的顺序排序,数据物理存放顺序和索引顺序时一直的,所以可以说找到索引就找到数据
- 非聚簇索引:索引和数据不再一起,存储的是数据地址,需要做两部查询,先找到索引获取数据地址,再去查数据
2.4.2 聚簇优缺点
优势:
- 聚簇查询快,可以直接获取数据
- 聚簇效率高,按照数据的大小排列的
- 适合用于排序场合
劣势: - 维护成本高
- 如果使用非自增数据作为索引,查询效果就会大幅度下降
- 字段字节大会导致整体索引小号更大