博客
关于我
MySQL 索引连环问题,你能答对几个?
阅读量:792 次
发布时间:2023-02-11

本文共 2059 字,大约阅读时间需要 6 分钟。

MySQL索引技秘谱:从基础到进阶深入解析

1. 索引的概念

索引可以被比作一本书的目录,能够快速定位书中的具体内容。在数据库查询中,索引起到了关键的作用。它存储在磁盘上,占用物理空间,能够显著提升查询效率。但过多的索引会对数据库的插入、更新操作产生负面影响。

2. MySQL索引类型

MySQL索引不仅仅是简单的二叉树,它支持多种数据结构和逻辑维度的组合。

2.1 数据结构维度

  • B+树索引:所有数据存储在叶子节点,复杂度为O(log n),适合范围查询。
  • 哈希索引:适合等值查询,效率高,一次到位。
  • 全文索引:支持在chartextvarchar类型上创建,用于文本内容的快速检索。
  • R-Tree索引:用于GIS数据类型的SPATIAL索引。

2.2 物理存储维度

  • 聚集索引:以主键创建,叶子节点存储表数据(InnoDB存储引擎)。
  • 非聚集索引:以非主键创建,叶子节点存储主键和索引列(InnoDB存储引擎)。

2.3 逻辑维度

  • 主键索引:不允许空值,唯一性强。
  • 普通索引:允许空值和重复值。
  • 联合索引:多字段组合索引,遵循最左前缀原则。
  • 唯一索引:列值唯一但允许空值。
  • 空间索引:支持OpenGIS几何数据模型,用于空间数据检索。

3. 索引失效场景

索引在特定条件下可能失效,导致全表扫描,影响查询性能。常见失效原因包括:

  • 查询条件中包含OR
  • 字段类型为字符串且未使用引号。
  • 使用LIKE通配符。
  • 联合索引查询条件不在索引列的最左端。
  • 索引字段上使用内置函数或运算符。
  • 索引字段上使用!=<>IN等条件。
  • 索引字段上使用IS NULLIS NOT NULL
  • 左连接或右连接查询字段编码不一致。
  • MySQL估计全表扫描比索引查询更高效。

4. 不适合建立索引的场景

  • 数据量少的表。
  • 更新频繁的字段。
  • 区分度低的字段(如性别)。
  • where、group by、order by等后未使用的字段。
  • 已有冗余索引的情况。

5. 为什么选择B+树而不是其他树结构?

B+树的优势体现在以下几个方面:

5.1 为什么不是一般二叉树?

  • 二叉树在磁盘环境下效率较低,容易变成链表形式,导致全表扫描。
  • 平衡二叉树虽然效率较高,但其每个节点存储的数据量有限,磁盘读取次数较多。

5.2 为什么选择B+树而不是平衡二叉树?

  • B+树的非叶子节点仅存储键值,不存储数据,能够降低树的高度,减少磁盘读取次数。

5.3 为什么选择B+树而不是B树?

  • B+树的所有数据都存储在叶子节点,数据按顺序排列,形成链表结构。这种设计使得范围查询、排序查询等操作显著高效。

6. B+树索引树的查询过程

select * from employee where age=32为例,实际查询过程涉及以下步骤:

  • 加载idx_age索引树的磁盘块。
  • 根据索引树结构,逐步缩小搜索范围。
  • 找到符合条件的叶子节点,获取主键值。
  • 回到主键索引树,通过主键值定位具体数据行。
  • 7. 回表的概念与减少方法

    回表是指在索引树中未找到匹配数据时,需要回到主键索引树获取主键值,再定位具体数据行。

    7.1 减少回表的方法

    • 尽量使用覆盖索引。
    • 在索引列上避免使用函数或运算符。
    • 确保联合索引的最左列是主键或唯一索引。

    8. 覆盖索引

    覆盖索引是指查询的数据列全部存在于索引树的叶子节点上。例如,select id, age from employee where age=32不需要回表,因为所需数据已在索引树中。

    9. 索引的最左前缀原则

    联合索引的最左列是关键,索引树会优先遍历最左列的值。例如,联合索引(a, b, c)实际上包含了单独的a(a, b)等多个索引。

    10. 索引下推优化

    索引下推优化是MySQL5.6新增的功能,允许索引树在遍历过程中直接筛选满足条件的记录,减少回表次数。

    11. 大表添加索引的方法

    • 创建新表并复制原表数据。
    • 在新表上添加所需索引。
    • 替换原表的数据和名称。

    12. 检查索引命中情况

    使用EXPLAIN命令查看查询执行计划,关注key字段,判断是否命中索引。

    12.1 关键字段解读

    • type:连接类型,性能从好到坏依次为consteq_refref等。
    • rows:估算的匹配行数。
    • filtered:满足条件的记录百分比。
    • extra:包含额外信息,如Using indexUsing where等。

    13. Hash索引与B+树的区别

    • B+树支持范围查询、联合索引和模糊查询。
    • Hash索引效率在等值查询上更高,但不支持范围查询和模糊查询。

    14. 索引的优缺点

    优点

    • 提高查询效率,减少锁竞争。
    • 支持复杂的查询条件。

    缺点

    • 索引占用额外空间。
    • 维护索引会增加开销。
    • 索引可能影响插入、更新性能。

    15. 聚簇索引与非聚簇索引

    聚簇索引

    • 数据和索引存储在同一结构中。
    • 叶子节点存储完整的数据记录。
    • 适合高频查询场景。

    非聚簇索引

    • 数据和索引存储分开。
    • 需要回表获取数据。
    • 适用于对查询性能要求不高的场景。

    转载地址:http://pbbfk.baihongyu.com/

    你可能感兴趣的文章
    MySQL8修改密码的方法
    查看>>
    Mysql8在Centos上安装后忘记root密码如何重新设置
    查看>>
    Mysql8在Windows上离线安装时忘记root密码
    查看>>
    MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
    查看>>
    mysql8的安装与卸载
    查看>>
    MySQL8,体验不一样的安装方式!
    查看>>
    MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
    查看>>
    Mysql: 对换(替换)两条记录的同一个字段值
    查看>>
    mysql:Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘解决方法
    查看>>
    MYSQL:基础——3N范式的表结构设计
    查看>>
    MYSQL:基础——触发器
    查看>>
    Mysql:连接报错“closing inbound before receiving peer‘s close_notify”
    查看>>
    mysqlbinlog报错unknown variable ‘default-character-set=utf8mb4‘
    查看>>
    mysqldump 参数--lock-tables浅析
    查看>>
    mysqldump 导出中文乱码
    查看>>
    mysqldump 导出数据库中每张表的前n条
    查看>>
    mysqldump: Got error: 1044: Access denied for user ‘xx’@’xx’ to database ‘xx’ when using LOCK TABLES
    查看>>
    Mysqldump参数大全(参数来源于mysql5.5.19源码)
    查看>>
    mysqldump备份时忽略某些表
    查看>>
    mysqldump实现数据备份及灾难恢复
    查看>>