MySQL 索引

定义

  • 帮助MySQL高效获取数据的数据结构
  • 默认都是使用B+树结构组织的索引

分类

  1. 数据结构纬度
    • B+树索引:所有数据存储在叶子节点,复杂度为O(logn),适合范围查询。
    • 哈希索引:适合等值查询,检索效率高,一次到位。
    • 全文索引:MyISAM和InnoDB中都支持使用全文索引,一般在文本类型char,text,varchar类型上创建。
  2. 物理存储纬度
    • 聚簇索引:聚簇索引就是以主键创建的索引,在叶子节点存储的是表中的数据。(Innodb存储引擎)
    • 非聚簇索引:非聚簇索引就是以非主键创建的索引,在叶子节点存储的是主键和索引列。(Innodb存储引擎)
  3. 逻辑纬度
    • 主键索引:一种特殊的唯一索引,不允许有空值。
    • 普通索引:基本索引类型,允许空值和重复值。
    • 联合索引:多个字段创建的索引,使用时遵循最左前缀原则。
    • 唯一索引:索引列中的值必须是唯一的,但是允许为空值。
    • 空间索引:MySQL5.7之后支持空间索引,在空间索引这方面遵循OpenGIS几何数据模型规则。

MsSQL 读取数据格式

数据库的 I/O 操作的最小单位是 **数据页**,InnoDB 默认的大小是 16KB
数据页包括 文件头、用户记录、页目录等
  • 文件头:有两个指针,分别指向上一个数据页和下一个数据页,连接起来相当于一个双向的链表
  • 用户记录:按照主键顺序组成单向链表
  • 页目录:由多个槽按照先后顺序组成
    • 将用户记录划分成几个组,记录包括最小记录(第一条记录)和最大记录(最后一条记录)
    • 组中最后一条记录会存储该组一共有多少条记录
    • 组中最后一条记录的地址偏移量称为槽,相当于分组记录的索引

数据结构

Hash表

  • 优点:
  • 适合单值快速检索数据
  • 缺点:
  • 不支持顺序和范围查询

二叉树

  • 优点:
  • 平衡时查询的时间复杂度为 O(log2(N))
  • 缺点:
  • 不平衡时查询的时间复杂度最大为O(N)

平衡二叉树

  • 优点:
  • 查询的时间复杂度都是 O(log2(N))
  • 缺点:
  • 数据量大时磁盘IO次数多
  • 不支持范围查询

B树

  • 特点:
  • B树的节点中存储这多个元素,每个内节点有多个分叉
  • 节点中的元素包含键值和数据,节点中的键值从大到小排列。
  • 父节点当中的元素不会出现在子节点中。
  • 所有的叶子节点都位于同一层,叶子节点具有相同的深度,叶子节点之间没有指针连接。
  • 优点:
  • 可以很好的提升查询的效率
  • 缺点:
  • 不支持范围快速查询
  • 行记录增加,所占空间变大,树高度变高,磁盘IO次数变大

B+树

  • 特点:
  • 只有叶子节点才会存储数据,非叶子节点只存储键值key
  • 叶子节点之间使用双向指针连接,最底层的叶子节点形成了一个双向有序链表
  • 优点:
  • 可以保证等值和范围查询的快速查找
  • 缺点:
  • 会占用更多的空间

回表与索引覆盖

  • 如果某个查询语句使用了二级索引,但是查询的数据不是主键值,这时在二级索引找到主键值后,需要去聚簇索引中获得数据行,这个过程就叫作「回表」,也就是说要查两个 B+ 树才能查到数据。
  • 当查询的数据是主键值时,因为只在二级索引就能查询到,不用再去聚簇索引查,这个过程就叫作「索引覆盖」,也就是只需要查一个 B+ 树就能找到数据。

索引优化

使用EXPLAIN关键字可以模拟优化器执行SQL查询语句
  1. 避免索引失效
    • 最左前缀匹配原则
    • 不在索引列上做任何计算、函数操作
    • 不使用:不等于和is not null
    • like不以通配符开头
    • 字符串字段不加单(双)引号
    • 不使用 or 连接
  2. 关联查询优化
    • 内连接时,mysql 会自动把小结果集选为驱动表,所以大表字段需加上索引
    • 左外连接时,左表(驱动表)会全表扫描,所以右边大表字段需加上索引
    • 右外连接同理,被驱动表上的字段需建立索引
  3. 排序、分组优化
    • 尽量避免使用Using FileSort方式排序
    • 语句满足索引最左匹配
    • 不要出现索引范围查询
  4. 慢查询日志

参考文章:MySQL的B+树

相关推荐

  1. MySQL索引

    2024-03-17 21:46:02       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-17 21:46:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-17 21:46:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-17 21:46:02       87 阅读
  4. Python语言-面向对象

    2024-03-17 21:46:02       96 阅读

热门阅读

  1. Qt——智能指针实战

    2024-03-17 21:46:02       45 阅读
  2. spring MVC 自定义注解实现路径匹配

    2024-03-17 21:46:02       42 阅读
  3. qt之画图

    2024-03-17 21:46:02       34 阅读
  4. Spring中的bean相关问题

    2024-03-17 21:46:02       48 阅读
  5. Ts中WebSocket连接管理与维护教程

    2024-03-17 21:46:02       30 阅读