一文搞懂mysql索引

mysql索引

  • 索引是啥
  • 索引类型
  • 数据库数据存储
    • MyISAM
    • InnoDB
  • 聚集索引和非聚集索引
    • 聚集索引
    • 非聚集索引
  • 为何应该使用自增整型主键
  • InnoDB非聚集索引
    • 回表查询
    • 索引覆盖
  • 联合索引
    • 最左匹配原则

索引是啥

索引是一种排好序的数据结构,mysql使用这种结构能够高效获取数据

索引类型

  1. 二叉树
    在一些情况下回退化为链表。
    一文搞懂mysql索引_第1张图片

  2. hash
    只能实现= 和in 查找,无法范围查找,可能有哈希冲突。查找复杂度低。
    一文搞懂mysql索引_第2张图片

  3. 红黑树
    树的高度在数据量大的情况下太高,效率较低。

  4. B树
    mysql使用B+树,非叶子节点不存储数据,只存储索引,叶子节点存储索引和数据,叶子节点之间有指针,方便范围查找。
    下面是B+树示意图
    一文搞懂mysql索引_第3张图片

下面是B树的示意图
一文搞懂mysql索引_第4张图片

没有使用B树的原因:B树的非叶子节点也存储数据,导致存储的索引树的高度比较高,查找效率差。而且因为数据可能不是那么整齐,io的预读利用不上,io性能也较差。

数据库数据存储

在mysql安装路径下有data目录,这个目录下有以数据表为名称的目录。

MyISAM

一文搞懂mysql索引_第5张图片

三种文件:
***.frm 数据表结构
***.MYI 数据表索引
***.MYD 数据表数据

InnoDB

***.frm 数据表结构
***.ibd 数据表索引和数据,本身就是一个按照B+tree组织的数据结构文件。

聚集索引和非聚集索引

聚集索引

索引叶子节点存储了数据。
一文搞懂mysql索引_第6张图片

非聚集索引

索引叶子节点只存储数据存储指针。索引和数据分开存储。
一文搞懂mysql索引_第7张图片

为何应该使用自增整型主键

  1. 如果没有合适的主键,数据库会自己建立一个隐形自增列作为主键索引。
  2. 非整型主键尤其是字符串主键,存储比较耗空间,比较比较耗性能。
  3. 自增主键在添加到索引树的时候能减少树的平衡带来的性能损耗。

InnoDB非聚集索引

回表查询

非聚集索引里面只有主键索引,需要再去主键索引再查一遍,拿到数据。

索引覆盖

如果查询的数据就在非聚集索引的键值里面,在非主键索引查一遍就拿到数据了,就不需要再去回表。

联合索引

多个字段组合成为一个索引键。
一文搞懂mysql索引_第8张图片

最左匹配原则

使用联合索引,一定要按照建立索引的顺序,从最左边开始匹配。
如果第一个索引子项没有,直接从后面的索引子项匹配,就不会走索引,因为在后面的索引项看来,索引不是排好序的,必须要全表扫描。

你可能感兴趣的:(数据库,数据结构,数据库,mysql,索引)