一、索引分类与数据结构
- 数据结构分类:B+树,Hash索引,Full-text索引
- 物理存储分类:聚集索引、非聚集索引
- 字段特性分类:主键索引(PRIMARY KEY)、唯一索引(UNIQUE)、普通索引(INDEX)、全文索引(FULLTEXT)
- 字段个数分类:单列索引、联合索引(也叫复合索引、组合索引)
如果一个表没有主键索引依旧会创建B+树
在InnoDB中,会为每一张表创建一个主键索引,如果没有明确的主键索引,会使用一个隐藏(ROW ID)的、自动生成的主键来创建索引。建议每个表都添加主键索引。
HASH索引
在InnoDB中不支持mysql,即使选择了hash索引,但是使用的依旧是B+,InnoDB只支持自适应的HASH索引,手动选择无效。
memory支持hash索引,存在hash冲突,使用链表解决
聚簇索引和非聚簇索引
聚集索引将索引和数据放在一起,非聚集索引分离开存储,所以需要二次查找。
在MySQL中二级索引使用非聚集索引
,除了主键索引都是二级索引。二级索引叶子节点存储主键id,根据id再次通过主键索引查找,这叫回表
覆盖索引
查询的字段都在索引列中叫覆盖索引。
索引下推
二级索引中
的优化手段,在范围查询中
减少回表次数,没有索引下推的时候,一个范围查询使用二级索引,第一次查询了一个范围的主键,假设查询到10条数据,那么需要回表十次,如果使用索引下推,那么只需要回表一次,就可以拿到十条数据。
单列索引
索引只有一个字段,即使是中文,构成的B+树也是有序的
联合索引
构成索引的是多个字段。如何保证数据有序?
假设有三个字段 name、age、id
那就按照name、age、id的先后顺序排序,最后这些字段都在B+树的叶子节点上。
最左前缀原则
当我创建n个字段的联合索引时,若想使用索引查询,查询条件必须使用第一个字段,因为联合索引是按照字段顺序排序的,没有第一个字段就是乱序。
创建A B C的联合索引,AB、AC、ABC都是可以走联合索引的,但是BC不可以
切记合理使用单列索引和联合索引,不可盲目添加索引
索引优缺点
优点:提高检索效率;减低排序成本,默认asc。
缺点:创建和维护索引需要时间;占用物理空间;降低表的增删改效率。
二、MySQL优化
Explain可以模拟优化器执行查询语句,帮助我们理解sql是如何运行的。
Explain字段含义
列名 | 含义 |
tyep | 查询所用的访问类型 |
possible_kes | 可能用到的索引 |
key | 实际用到的索引 |
ref | 使用索引时,与索引等值匹配的列或者常量 |