- B+树索引
- 自适应哈希索引(自动生成)
B+树索引:
叶子节点会形成一个双向链表。
聚集索引:
按照每张表的主键构造一颗B+树(每张表只能有一个聚集索引),叶子节点是数据页。
注:B+树索引不能找到具体行(叶子节点为数据页),只能找到具体行所在的数据页,然后将数据页读入内存,按行查找具体行(二分)。
- 聚集索引的存储-逻辑上连续,非物理上连续。(数据页双向链表,业内数据也是双向链表)
- 范围查询很快。
非聚集索引:
辅助索引,叶节点不包含行的全部数据。除了包含键值,还包含一个书签。(指向对应行数据的聚集索引键,即主键)。
非聚集索引-离散读,不能很好的支持范围查找。
堆表:数据按插入顺序存放。没有主键,索引都是非聚集的。
此时非聚集索引的书签是行标识符,如“文件号:页号:槽号”。
索引的创建和删除:
主键索引的创建和删除:需创建一张临时表,把数据导入临时表,删除原表,再将临时表重命名为原表名。需要很长时间。
辅助索引的创建:快速索引创建,对表加上一个S锁(表级锁)。创建过程中只能进行读操作。
辅助索引的删除:将辅助索引空间标记为可用。
辅助索引的优化使用:
InnoDB存储引擎会先从辅助节点的叶节点判断是否能得到所需的数据。
辅助索引可以获取所需的所有数据,会优先走辅助索引。
如果要对字段a进行排序,会直接走主键索引。
联合索引:
多列索引,B+树。
- 多列索引 (a, b) ,select * from table where a = xxx,可以使用这个索引;select * from table where b = xxx不能使用这个索引 - 查询条件不包含前面的索引列只包含后面的索引列时,不能使用多列索引
- 可以对第二个键值进行排序
自适应哈希索引:
使用散列表(Hash Table),InnoDB存储引擎自动创建。管理InnoDB缓冲池内存。
离散查找很快,范围查找效率不高。
直接寻址表:
哈希表:
对于缓冲池页的哈希表来说,在缓冲池中的page页都有一个chain指针,指向相同哈希值的页。