前言
都是工作中常用的知识点,涉及实战方面的会单独总结一篇文章,这里只是列了一个大纲,如果有理解错误的地方,欢迎斧正:

首先说一下MySQL常用的两种引擎以及特点:
InnoDB引擎
- 支持事务、外键和行级锁;
- 底层使用B+Tree结构,如果是主键索引,叶子节点存储整行数据,如非主键索引,叶子节点存储主键id,非叶子节点不存储任何数据。
- 主键索引B+Tree存储结构:

- 非主键索引B+Tree存储结构:

看这两张截图,再去理解一下上面的话就容易的多了。
MyISAM引擎
- 不支持事务、外键和行级锁。
- 搜索可能在非叶子节点结束,叶结点包含索引字段值及指向数据页数据行的逻辑指针:

聚簇索引与非聚簇索引
聚簇索引(聚集索引)
- 插入速度严重依赖于插入顺序,按照主键自增的方法插入,是InnoDB引擎中最快的方式;
- 如果没有定义主键,InnoDB会选择一个唯一的非空索引代替;
- 如果没有这样的索引,InnoDB会隐式定义一个主键来作为局促索引;
- 插入操作会比较慢,因为会设计到B+Tree自平衡的操作;
- 叶子节点的数据会和节点的数据重叠;
非聚簇索引(非聚集索引)
- 因为一个表中只能有一个聚簇索引,所以非聚簇索引也被称为二级索引,底层叶子节点存储的是主键id;
- 叶子节点的数据不会和节点的数据重叠;
- 通常使用非聚簇索引查询会涉及到回表查询,使用覆盖索引可避免;
联合索引(复合索引)
- 使用联合索引应遵守最左匹配原则,如联合索引
(a,b,c),查询时应使用abc、ab或a,才会生效,必须要保证从左到右的顺序,ac、bc这种是无效的;
唯一索引
- 唯一索引是单个或多个字段的组合,这些组合字段不可重复,创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复;
索引排序
使用order by排序时应使用索引字段排序,否则会使用文件排序;