对于mysql 索引 最左前缀匹配原则 个人理解;

由于mysql 在构建多字段 联合索引时, 其设计原则为

  1. 读取创建索引时 指定的字段顺序(从左到右)
  2. 在构建B+tree非叶子节点时,其会按照 字段从左到右的顺序进行组合,并依次对字段存储的数据按照从小到大的顺序进行排序;最终保证整体索引数据的有序性

 

如果不使用 最左前缀匹配原则,在执行查找操作时 就无法利用 B+tree 有序数据的特点,从而会导致时间复杂度直接退化为 O(n)级别

而对于B+tree 本身的查询时间复杂度为 O(logmn) m表示其为m叉树, n表示为节点的总数量;

 

mysql 本身对 B+tree 的叶子节点做了优化,首先叶子节点存储的是当前索引字段关联的所有主键,且对于所有的叶子节点按照从左到右的顺序进行连接构成单链表; 从而其支持 (索引)范围查询;

 

对于索引范围查询其特点为 只需要通过定位 起始条件索引叶子节点查询位置 以及 定位 终止条件 索引叶子节点查询位置, 通过直接定位起始叶子节点快速遍历到终止叶子节点,从而提高查询效率