索引
1. 什么是索引?
- 索引是帮助MySQL高校获取数据的数据结构
- 索引存储在文件系统中
- 索引的文件存储形式与存储引擎有关
- 索引文件的结构
- hash
- 二叉树
- B树
- B+树
2. 索引的分类
MySQL索引有五种类型。通过给字段添加索引可以提高数据的读取速度,提高项目的并发能力和抗压能力。
-
主键索引
主键是一种唯一性索引,但它必须指定为PRIMARY KEY,每个表只能有一个主键。
-
唯一索引
索引列的所有值只能出现一次,即必须唯一,值可以为空。
-
普通索引
基本的索引类型,值可以为空,没有唯一性的限制。
-
全文索引
全文索引的索引类型为FULLTEXT。全文索引可以在Varchar、char、text类型的列上创建
-
组合索引
多列值组成一个索引,专门用于组合搜索
索引使用过程中出现的情况:
-
回表
使用非主键索引进行查询时,先通过索引查找到记录的主键,再使用主键索引查询到数据。查询了两次索引,被称为回表。
-
最左匹配
建立索引 age,gender 执行查询: # 会使用索引 SELECT * FROM student WHERE age = ? AND gender = ? # 会被mysql的SQL优化器优化,然后使用age,gender索引 SELECT * FROM student WHERE gender = ? AND age = ? # 不会使用索引,因为匹配不到gender SELECT * FROM student WHERE gender = ? # 会使用索引,因为匹配到了age SELECT * FROM student WHERE age = ? 这种情况被称为mysql的最左匹配原则
-
索引覆盖
使用非主键索引查询主键id时,通过非主键索引查找到记录的主键,而不需要再去通过主键索引查询数据时,被称为索引覆盖。
-
索引下推
建立索引:age,gender 进行查询: SELECT * FROM student WHERE age = ? AND gender = ? 在没有索引下推前:先根据age进行查询,然后将查询结果再通过gender筛选,得到最终结果 使用了索引下推后:直接在存储引擎层根据age和gender拉取数据,一起得到最终结果。
3. 索引的实现
InnoDB:
- 表数据文件本身就是按B+ Tree组织的一个索引结构文件
- 聚集索引-叶节点包含了完成的数据记录
- InnoDB表必须要有主键,且推荐使用整型的自增主键
- 非主键叶子节点存储的是主键值 (一致性和节省存储空间)
MyISAM:
- 表数据和索引结构分别存储在不同的文件当中
- 非聚簇索引,只在节点中存储记录的地址(在数据文件中的地址)
详细内容:
http://blog.codinglabs.org/articles/theory-of-mysql-index.html