当前位置: 首页 > news >正文

开始改变第六天 MySQL(1)

深入理解MySQL架构、InnoDB存储引擎与索引优化

一、MySQL整体架构与SQL执行流程

MySQL架构概览

MySQL采用经典的C/S架构,主要分为以下几个层次:

客户端 -> 连接层 -> 服务层 -> 存储引擎层 -> 文件系统层

SQL执行流程详解

  1. 连接建立

    • 客户端通过TCP/IP或Socket与MySQL建立连接
    • 连接器进行身份认证和权限验证
    • 连接成功后,分配线程处理该连接
  2. 查询缓存(MySQL 8.0已移除)

    • 检查查询是否在缓存中存在
    • 如果命中缓存,直接返回结果
  3. 解析与预处理

    -- 示例SQL
    SELECT * FROM users WHERE id = 1 AND name = '张三';
    
    • 词法分析:识别SELECT、FROM、WHERE等关键词
    • 语法分析:构建语法树,检查语法正确性
    • 预处理:检查表、列是否存在,解析别名等
  4. 查询优化

    • 优化器选择最优执行计划
    • 考虑因素:索引选择、连接顺序、成本估算等
  5. 执行引擎

    • 调用存储引擎API执行查询
    • 返回结果给客户端

二、InnoDB内存与磁盘结构

内存结构(Memory Structures)

  1. Buffer Pool(缓冲池)

    • 数据页的缓存区域,减少磁盘I/O
    • 采用LRU算法管理页面
    • 包含数据页、索引页、插入缓冲等
  2. Change Buffer(变更缓冲区)

    • 缓存非唯一索引的变更操作
    • 当相关页被读取时合并变更
  3. Log Buffer(日志缓冲区)

    • 缓存redo log,定期刷盘
    • 提高事务提交效率
  4. Adaptive Hash Index(自适应哈希索引)

    • 自动为热点数据建立哈希索引
    • 加速等值查询

磁盘结构(Disk Structures)

  1. 表空间(Tablespaces)

    • 系统表空间:ibdata1文件
    • 独立表空间:每表一个.ibd文件
    • 通用表空间:多表共享表空间
  2. 重做日志(Redo Log)

    • 保证事务的持久性
    • 循环写入ib_logfile0、ib_logfile1
  3. 撤销日志(Undo Log)

    • 实现事务回滚和MVCC
    • 存储在系统表空间或独立的undo表空间

三、B+树的优势与原理

B+树核心特性

B+树结构:
根节点 -> 非叶子节点(只存索引) -> 叶子节点(存数据+指针)

相比B树的优势

  1. 更高的查询效率

    • 所有数据都在叶子节点,查询路径长度固定
    • 更适合范围查询和全表扫描
  2. 更好的磁盘I/O性能

    • 节点可以存储更多键值,树高更低
    • 减少磁盘访问次数
  3. 更适合数据库场景

    • 叶子节点形成链表,便于范围查询
    • 非叶子节点只存索引,可以缓存更多索引数据

B+树在InnoDB中的实现

  • 聚簇索引:叶子节点存储完整行数据
  • 二级索引:叶子节点存储主键值,需要回表查询

四、索引建立与优化实践

如何建立高效索引

-- 创建单列索引
CREATE INDEX idx_name ON users(name);-- 创建复合索引
CREATE INDEX idx_name_age ON users(name, age);-- 创建唯一索引
CREATE UNIQUE INDEX idx_email ON users(email);

索引设计原则

  1. 选择区分度高的列

    -- 区分度低的列不适合建索引
    SELECT COUNT(DISTINCT gender) / COUNT(*) FROM users; -- 可能只有0.5-- 区分度高的列适合建索引
    SELECT COUNT(DISTINCT email) / COUNT(*) FROM users; -- 接近1.0
    
  2. 考虑查询频率

    • 为WHERE、JOIN、ORDER BY、GROUP BY涉及的列建立索引
  3. 复合索引的最左前缀原则

    -- 索引: (name, age, city)
    SELECT * FROM users WHERE name = '张三'; -- 使用索引
    SELECT * FROM users WHERE name = '张三' AND age = 25; -- 使用索引
    SELECT * FROM users WHERE age = 25; -- 不使用索引(违反最左前缀)
    

回表查询与覆盖索引

  1. 回表查询

    -- 假设在name上有二级索引
    SELECT * FROM users WHERE name = '张三';
    -- 执行流程:
    -- 1. 在name索引树找到'张三'对应的主键id
    -- 2. 用主键id到聚簇索引中查找完整数据
    -- 这就是回表查询
    
  2. 覆盖索引优化

    -- 创建覆盖索引
    CREATE INDEX idx_name_age ON users(name, age);-- 查询只需要索引列,避免回表
    SELECT name, age FROM users WHERE name = '张三';
    -- 直接从索引树获取数据,无需访问数据行
    

索引失效的常见场景

  1. 违反最左前缀原则

    -- 索引: (name, age)
    SELECT * FROM users WHERE age = 25; -- 索引失效
    
  2. 在索引列上使用函数或计算

    SELECT * FROM users WHERE YEAR(create_time) = 2023; -- 索引失效
    -- 优化为:
    SELECT * FROM users WHERE create_time >= '2023-01-01' AND create_time < '2024-01-01';
    
  3. 使用不等于(!=或<>)

    SELECT * FROM users WHERE status != 1; -- 可能全表扫描
    
  4. LIKE以通配符开头

    SELECT * FROM users WHERE name LIKE '%张%'; -- 索引失效
    SELECT * FROM users WHERE name LIKE '张%'; -- 可以使用索引
    
  5. 类型转换

    -- 假设phone是varchar类型
    SELECT * FROM users WHERE phone = 13800138000; -- 索引失效
    SELECT * FROM users WHERE phone = '13800138000'; -- 使用索引
    
  6. OR条件处理不当

    -- 假设name有索引,age无索引
    SELECT * FROM users WHERE name = '张三' OR age = 25; -- 索引失效
    

索引使用最佳实践

-- 1. 使用EXPLAIN分析查询
EXPLAIN SELECT * FROM users WHERE name = '张三';-- 2. 监控慢查询
SHOW VARIABLES LIKE 'slow_query_log%';-- 3. 定期分析索引使用情况
SELECT * FROM sys.schema_unused_indexes;-- 4. 避免过度索引,每个索引都会增加维护成本

总结

理解MySQL的架构和索引原理是数据库性能优化的基础。通过合理设计索引、避免索引失效场景、利用覆盖索引等技术,可以显著提升数据库查询性能。在实际应用中,要结合具体的业务场景和查询模式来制定索引策略,并通过监控工具持续优化。

记住:索引不是越多越好,合适的索引才是最好的索引。

http://www.dtcms.com/a/548716.html

相关文章:

  • 电脑网站自适应怎么做企业型网站建设怎样收费
  • 阿里培训网站建设杭州网站制作模板
  • Rust 所有权系统:如何为内存安全保驾护航
  • HarmonyOS WindowExtension深度解析:构建跨窗口交互的创新体验
  • PDF导出服务
  • 20251030在AIO-3576Q38开发板的Android14下确认TF卡
  • 《模仿人类皮肤层与环层小体的社交交互机器人皮肤》2024 IEEE/ASME TMECH 论文解读
  • PHP Laravel 10 框架:使用队列处理异步任务(邮件发送 / 数据导出)
  • 拉丝机东莞网站建设怎样做软件开发
  • 苍山网站建设网站设计分享
  • 一个蛇形填充n×n矩阵的算法
  • git index lockFile exists 问题
  • 一段音频/视频分离成人声与伴奏,Windows + Anaconda 快速跑通 Spleeter(离线可用)
  • RecyclerView设置边缘渐变失效
  • 网站续费模版徐州建设工程网上交易平台
  • [系统架构设计师]云原生架构
  • spec-kit深度解析:AI驱动的规范驱动开发(SDD)的架构、哲学与实践启示
  • 怎么学做网站哈尔滨十大广告公司
  • AI应用开发
  • Rust 中精确大小迭代器(ExactSizeIterator)的深度解析与实践
  • 培训/课程预约小程序开发-提升教育机构的管理效率和用户体验
  • 【Unity基础详解】(3)Unity核心类:GameObject
  • oj题 ——— 单链表oj题
  • 企业网站建设推广含义网站建设开发上线流程
  • Unity-AutoHand插件手势跟踪响应研究
  • 数据结构——三十三、Dijkstra算法(王道408)
  • MQTTX:全能的 MQTT 客户端工具简化物联网开发
  • 抗体芯片技术:超越Western Blot的高通量蛋白分析方案
  • 佛山公司网站建设价格企业查询平台
  • k8s介绍+k8s部署