博客
关于我
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/

    你可能感兴趣的文章
    MaterialForm对tab页进行隐藏
    查看>>
    Member var and Static var.
    查看>>
    memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
    查看>>
    memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
    查看>>
    Memcached:Node.js 高性能缓存解决方案
    查看>>
    memcache、redis原理对比
    查看>>
    memset初始化高维数组为-1/0
    查看>>
    Merge Two Sorted Lists - LeetCode
    查看>>
    Mesos 资源分配
    查看>>
    Metasploit CGI网关接口渗透测试实战
    查看>>
    Metasploit SQL注入漏洞渗透测试实战
    查看>>
    Metasploit Web服务器渗透测试实战
    查看>>
    Metasploit Windows AD渗透测试实战
    查看>>
    MFC之处理消息映射的步骤...
    查看>>
    MFC对话框屏幕居中
    查看>>
    MFC工作笔记0011---atoi的用法
    查看>>
    MFC模态对话框和非模态对话框
    查看>>
    Miaoo朋友圈程序全完整版源码
    查看>>
    Milesight VPN server.js 任意文件读取漏洞(CVE-2023-23907)
    查看>>
    mockcpp & testngpp在2010.7~11月的改进
    查看>>