前言

都是工作中常用的知识点,涉及实战方面的会单独总结一篇文章,这里只是列了一个大纲,如果有理解错误的地方,欢迎斧正:
Mysql进阶必看
首先说一下MySQL常用的两种引擎以及特点:

InnoDB引擎

  • 支持事务、外键和行级锁;
  • 底层使用B+Tree结构,如果是主键索引,叶子节点存储整行数据,如非主键索引,叶子节点存储主键id,非叶子节点不存储任何数据。
    • 主键索引B+Tree存储结构:
      主键索引存储结构
    • 非主键索引B+Tree存储结构:
      非主键索引B+Tree存储结构
      看这两张截图,再去理解一下上面的话就容易的多了。

MyISAM引擎

  • 不支持事务、外键和行级锁。
  • 搜索可能在非叶子节点结束,叶结点包含索引字段值及指向数据页数据行的逻辑指针:
    B-Tree结构

聚簇索引与非聚簇索引

  • 区别:唯一的区别在于叶子节点是否存储整行数据;

聚簇索引(聚集索引)

  • 插入速度严重依赖于插入顺序,按照主键自增的方法插入,是InnoDB引擎中最快的方式;
  • 如果没有定义主键,InnoDB会选择一个唯一的非空索引代替;
  • 如果没有这样的索引,InnoDB会隐式定义一个主键来作为局促索引;
  • 插入操作会比较慢,因为会设计到B+Tree自平衡的操作;
  • 叶子节点的数据会和节点的数据重叠;

非聚簇索引(非聚集索引)

  • 因为一个表中只能有一个聚簇索引,所以非聚簇索引也被称为二级索引,底层叶子节点存储的是主键id;
  • 叶子节点的数据不会和节点的数据重叠;
  • 通常使用非聚簇索引查询会涉及到回表查询,使用覆盖索引可避免;

联合索引(复合索引)

  • 使用联合索引应遵守最左匹配原则,如联合索引 (a,b,c),查询时应使用abcaba,才会生效,必须要保证从左到右的顺序,bc这种是无效的;

跳跃索引

  • 还是上面的例子,联合索引 (a,b,c),当使用索引 a、c进行查询时,是可以生效的,虽然中间跳过了索引b,但查询条件能够包含联合索引的最左边的字段,MySQL就可以利用这部分索引来减少扫描范围,从而提高查询效率。这种方式并没有违反最左匹配原则,而是对其的一种补充和优化。

唯一索引

  • 唯一索引是单个或多个字段的组合,这些组合字段不可重复,创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复;

索引排序

使用order by排序时应使用索引字段排序,否则会使用文件排序;

Logo

更多推荐