innodb存储引擎 索引的类型和使用

mysql存储结构

mysql的基础存储结构为页
innodb存储引擎 索引的类型和使用_第1张图片
特点:

每一页都是一个双向链表。
每一页的记录又组成单向链表。
每一页都会为它存储的数据记录生成页目录,

分析

  主键作为搜索条件:查找数据可以通过二分法查找快速找到对应的槽位,通过槽位快速找出对应的分组并找到数据。
  其他非主键作为搜索条件:遍历双向链表找到对应页,通过遍历对应页单向链表来查找数据。

为了解决遍历双向链表慢的问题,引入B+树数据结构

B+树索引结构解释

innodb存储引擎 索引的类型和使用_第2张图片
浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示),如磁盘块1包含数据项17和35,包含指针P1、P2、P3,P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块。真实的数据存在于叶子节点即3、5、9、10、13、15、28、29、36、60、75、79、90、99。非叶子节点不存储真实的数据,只存储指引搜索方向的数据项,如17、35并不真实存在于数据表中。
使用聚合索引(主键索引,没有主键则默认生成一个六位的主键),这个聚合索引的叶子节点保存的是数据页
后面创建的非聚合索引的叶子节点保存的是主键,然后通过主键在聚合索引中查找对应的数据页

索引的类型和使用

1.索引的类型及其特点

1.1类型

  1. 普通索引
  2. 唯一索引
  3. 主键索引:也就是聚簇索引
  4. 全文索引(FULLTEXT)
  5. 聚集索引
  6. 非聚集索引

聚集索引和非聚集索引的区别

聚族索引:主键索引是聚族索引。表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致。对于聚集索引,叶子结点即存储了真实的数据行,不再有另外单独的数据页。 在一张表上最多只能创建一个聚集索引,因为真实数据的物理顺序只能有一种。
非聚族索引:表数据存储顺序与索引顺序无关。对于非聚集索引,叶结点包含索引字段值及指向数据页数据行的逻辑指针,其行数量与数据表行数据量一致。

2.索引的数据结构

B+树解决了B树的问题:

  1. 无法进行范围存储
  2. 无法定位行数据

解决方案:

  1. 数据行单独存储;节点中增加一个字段,定位key对应数据行的位置。
  2. 修改key与子树的判断逻辑,使子树大于等于上一key小于下一key,最终所有访问都将落于叶子节点;叶子节点中直接存储数据行或数据行的位置。
  3. 由于所有数据行都存储在叶子节点,B树的叶子节点本身也是有序的,可以增加一个指针,指向当前叶子节点按主键顺序的下一叶子节点;查询时先查到左界,再查到右界,然后从左界到有界线性遍历.

索引使用流程
innodb存储引擎 索引的类型和使用_第3张图片
通过三个部分进行分析

  1. Index Key :MySQL是用来确定扫描的数据范围,实际就是可以利用到的MySQL索引部分,体现在Key Length。
  2. Index Filter:MySQL用来确定哪些数据是可以用索引去过滤,在启用ICP后,可以用上索引的部分。
  3. Table Filter:MySQL无法用索引过滤,回表取回行数据后,到server层进行数据过滤。

流程

1.使用mysql查询优化器,通过改变查询条件的排列顺序,以确定查询的最优解的查询条件排列顺序。
2.利用=、>=、<=来确定下边界(first key),利用最左原则,确定可以使用的索引
3.使用索引,筛选出符合条件的数据
4.MySQL无法用索引过滤,回表取回行数据后,到server层进行数据过滤。

你可能感兴趣的:(sql,数据库,sql性能优化)