高性能 MySQL

🌙
手机阅读
本文目录结构

高性能 MySQL

编辑推荐

“只要你不敢以 MySQL 专家自诩,又岂敢错过这本神书?”

“一言以蔽之,写得好,编排得好,需要参考时容易到爆!”

“我可是从头到尾看了一遍上一版,可还是毫不犹豫拿起了这本《高性能 MySQL(第 3 版)》,而且看完后一点都不后悔……”

◎ 学习 MySQL 新特性,包括存储引擎、分区数据库、触发器和视图

◎ 实现复制的改进、高可用和集群

◎ 获得在云端运行 MySQL 的高性能

◎ 优化高级查询特性,如全文索引

◎ 从现代的多核 CPU 和固态硬盘中获益

◎ 探索备份和恢复的策略,包括新的在线备份工具

内容简介

《高性能 MySQL(第 3 版)》是 MySQL 领域的经典之作,拥有广泛的影响力。第 3 版更新了大量的内容,不但涵盖了 MySQL5.5 版本的新特性,也讲述了关于固态盘、高可扩展性设计和云计算环境下的数据库相关的新内容,原有的基准测试和性能优化部分也做了大量的扩展和补充。全书共分为 16 章和 6 个附录,内容涵盖 MySQL 架构和历史,基准测试和性能剖析,数据库软硬件性能优化,复制、备份和恢复,高可用与高可扩展性,以及云端的 MySQL 和 MySQL 相关工具等方面的内容。每一章都是相对独立的主题,读者可以有选择性地单独阅读。

《高性能 MySQL(第 3 版)》不但适合数据库管理员(DBA)阅读,也适合开发人员参考学习。不管是数据库新手还是专家,相信都能从本书有所收获。

作者简介

BaronSchwartz 是一位软件工程师,居住在弗吉尼亚州的 Charlottesville,网络常用名是 Xaprb,这是按照 QWERTY 键盘的顺序在 Dvorak 键盘上打出来的名字。在不忙于解决有趣的编程挑战时,Baron 会和他的妻子 Lynn 以及小狗 Carbon 一起享受闲暇的时光。他有一个软件工程方面的博客。

PeterZaitsev 曾经是 MySQLAB 公司高性能组的经理,目前在运作 mysqlperformanceblog.com 网站。他擅长于帮助那些每天有数以百万计访问量的网站的管理员解决问题,这些网站通常需要几百台机器来处理 TB 级的数据。他常常为了解决一个问题而不停地升级硬件和软件(比如查询优化)。Peter 还经常在各种会议上演讲。

VadimTkachenko 曾经是 MySQLAB 公司的性能工程师。作为一名在多线程编程和同步方面的专家,他的主要工作是基准测试、性能剖析,以及找出系统的性能瓶颈。他还在性能监控和调优方面做了一些工作,使得 MySQL 在多核机器上有更好的可扩展性。

译者简介

宁海元有超过十年的数据库管理经验,从最初的 SQLServer2000 到 Oracle 再到 MySQL,擅长数据库高可用架构、性能优化和故障诊断。2007 年加入*,带领*DBA 团队完成了数据库的垂直拆分、水平拆分,迁移到 MySQL 体系等主要工作,为*业务的快速增长提供支撑。目前专注于无线数据领域。网络常用名 NinGoo,

周振兴毕业于北京师范大学数学系,2009 年加入*数据库团队,负责 MySQL 运维管理工作,有丰富的 MySQL 性能优化、Troubleshooting 经验,对 MySQL 主要模块的实现和原理有深入的研究,经历了*MySQL 实例从 30 到 3000 的发展,对系统架构、高可用环境规划都有深入理解。

彭立勋 2010 年大学毕业后加入********运维部。作为一名 MySQLDBA,在运维 MySQL 的过程中对 MySQL 和 InnoDB 的一些功能和缺陷进行了补充,编写了多主复制和数据闪回等补丁。目前在阿里集团核心系统研发部数据库组,专注于 MySQL 数据库相关的开发工作。后来一些补丁被 MySQL 之父 Mony 看中,多主复制、线程内存监控等补丁被合并到了 MariaDB10.0 版本,本人也因此成为 MariaDB 提交组(Maria-captains)成员。

翟卫祥毕业于武汉大学,研究生阶段从事数据库相关研究。毕业后就职数据库技术团队至今,主要负责阿里内部 MySQL 代码分支维护,包括 MySQLBugFix 及新特性开发。对 MySQL 内核有一定的研究。

刘辉 2008 年毕业于西安电子科技大学计算机系,硕士学位。2011 年加入数据库技术团队,花名希羽,MySQL 内核开发工程师。

目录

推荐序 前言

第 1 章 MySQL 架构与历史

  • 1.1 MySQL 逻辑架构
  • 1.1.1 连接管理与安全性
  • 1.1.2 优化与执行
  • 1.2 并发控制
  • 1.2.1 读写锁
  • 1.2.2 锁粒度
  • 1.3 事务
  • 1.3.1 隔离级别
  • 1.3.2 死锁
  • 1.3.3 事务日志
  • 1.3.4 MySQL 中的事务
  • 1.4 多版本并发控制
  • 1.5 MySQL 的存储引擎
  • 1.5.1 InnoDB 存储引擎
  • 1.5.2 MyISAM 存储引擎
  • 1.5.3 MySQL 内建的其他存储引擎
  • 1.5.4 第三方存储引擎
  • 1.5.5 选择合适的引擎
  • 1.5.6 转换表的引擎
  • 1.6 MySQL 时间线(Timeline)
  • 1.7 MySQL 的开发模式
  • 1.8 总结

第 2 章 MySQL 基准测试

  • 2.1 为什么需要基准测试
  • 2.2 基准测试的策略
  • 2.2.1 测试何种指标
  • 2.3 基准测试方法
  • 2.3.1 设计和规划基准测试
  • 2.3.2 基准测试应该运行多长时间
  • 2.3.3 获取系统性能和状态
  • 2.3.4 获得准确的测试结果
  • 2.3.5 运行基准测试并分析结果
  • 2.3.6 绘图的重要性
  • 2.4 基准测试工具
  • 2.4.1 集成式测试工具
  • 2.4.2 单组件式测试工具
  • 2.5 基准测试案例
  • 2.5.1 http_load
  • 2.5.2 MySQL 基准测试套件 .
  • 2.5.3 sysbench
  • 2.5.4 数据库测试套件中的 dbt2 TPC-C 测试
  • 2.5.5 Percona 的 TPCC-MySQL 测试工具
  • 2.6 总结

第 3 章 服务器性能剖析

  • 3.1 性能优化简介
  • 3.1.1 通过性能剖析进行优化
  • 3.1.2 理解性能剖析
  • 3.2 对应用程序进行性能剖析
  • 3.2.1 测量 PHP 应用程序
  • 3.3 剖析 MySQL 查询
  • 3.3.1 剖析服务器负载
  • 3.3.2 剖析单条查询
  • 3.3.3 使用性能剖析
  • 3.4 诊断间歇性问题
  • 3.4.1 单条查询问题还是服务器问题
  • 3.4.2 捕获诊断数据
  • 3.4.3 一个诊断案例
  • 3.5 其他剖析工具
  • 3.5.1 使用 USER_STATISTICS 表
  • 3.5.2 使用 strace
  • 3.6 总结

第 4 章 Schema 与数据类型优化

  • 4.1 选择优化的数据类型
  • 4.1.1 整数类型
  • 4.1.2 实数类型
  • 4.1.3 字符串类型
  • 4.1.4 日期和时间类型
  • 4.1.5 位数据类型
  • 4.1.6 选择标识符(identifier)
  • 4.1.7 特殊类型数据
  • 4.2 MySQL schema 设计中的陷阱
  • 4.3 范式和反范式
  • 4.3.1 范式的优点和缺点
  • 4.3.2 反范式的优点和缺点 .
  • 4.3.3 混用范式化和反范式化
  • 4.4 缓存表和汇总表
  • 4.4.1 物化视图
  • 4.4.2 计数器表
  • 4.5 加快 ALTER TABLE 操作的速度
  • 4.5.1 只修改。frm 文件
  • 4.5.2 快速创建 MyISAM 索引
  • 4.6 总结

第 5 章 创建高性能的索引

  • 5.1 索引基础
  • 5.1.1 索引的类型
  • 5.2 索引的优点
  • 5.3 高性能的索引策略
  • 5.3.1 独立的列
  • 5.3.2 前缀索引和索引选择性
  • 5.3.3 多列索引
  • 5.3.4 选择合适的索引列顺序
  • 5.3.5 聚簇索引
  • 5.3.6 覆盖索引
  • 5.3.7 使用索引扫描来做排序
  • 5.3.8 压缩(前缀压缩)索引
  • 5.3.9 冗余和重复索引
  • 5.3.10 未使用的索引
  • 5.3.11 索引和锁
  • 5.4 索引案例学习
  • 5.4.1 支持多种过滤条件
  • 5.4.2 避免多个范围条件
  • 5.4.3 优化排序
  • 5.5 维护索引和表
  • 5.5.1 找到并修复损坏的表 .
  • 5.5.2 更新索引统计信息
  • 5.5.3 减少索引和数据的碎片
  • 5.6 总结

第 6 章 查询性能优化

  • 6.1 为什么查询速度会慢
  • 6.2 慢查询基础:优化数据访问
  • 6.2.1 是否向服务器请求了不需要的数据
  • 6.2.2 MySQL 是否在扫描额外的记录
  • 6.3 重构查询的方式
  • 6.3.1 一个复杂查询还是多个简单查询
  • 6.3.2 切分查询
  • 6.3.3 分解关联查询
  • 6.4 查询执行的基础
  • 6.4.1 MySQL 客户端 / 服务器通信协议
  • 6.4.2 查询缓存
  • 6.4.3 查询优化处理
  • 6.4.4 查询执行引擎
  • 6.4.5 返回结果给客户端
  • 6.5 MySQL 查询优化器的局限性
  • 6.5.1 关联子查询
  • 6.5.2 UNION 的限制
  • 6.5.3 索引合并优化
  • 6.5.4 等值传递
  • 6.5.5 并行执行
  • 6.5.6 哈希关联
  • 6.5.7 松散索引扫描
  • 6.5.8 最大值和最小值优化 .
  • 6.5.9 在同一个表上查询和更新
  • 6.6 查询优化器的提示(hint)
  • 6.7 优化特定类型的查询
  • 6.7.1 优化 COUNT() 查询
  • 6.7.2 优化关联查询
  • 6.7.3 优化子查询
  • 6.7.4 优化 GROUP BY 和 DISTINCT
  • 6.7.5 优化 LIMIT 分页
  • 6.7.6 优化 SQL_CALC_FOUND_ROWS
  • 6.7.7 优化 UNION 查询
  • 6.7.8 静态查询分析
  • 6.7.9 使用用户自定义变量 .
  • 6.8 案例学习
  • 6.8.1 使用 MySQL 构建一个队列表
  • 6.8.2 计算两点之间的距离 .
  • 6.8.3 使用用户自定义函数 .
  • 6.9 总结

第 7 章 MySQL 高级特性

  • 7.1 分区表
  • 7.1.1 分区表的原理
  • 7.1.2 分区表的类型
  • 7.1.3 如何使用分区表
  • 7.1.4 什么情况下会出问题 .
  • 7.1.5 查询优化
  • 7.1.6 合并表
  • 7.2 视图
  • 7.2.1 可更新视图
  • 7.2.2 视图对性能的影响
  • 7.2.3 视图的限制
  • 7.3 外键约束
  • 7.4 在 MySQL 内部存储代码
  • 7.4.1 存储过程和函数
  • 7.4.2 触发器
  • 7.4.3 事件
  • 7.4.4 在存储程序中保留注释
  • 7.5 游标
  • 7.6 绑定变量
  • 7.6.1 绑定变量的优化
  • 7.6.2 SQL 接口的绑定变量
  • 7.6.3 绑定变量的限制
  • 7.7 用户自定义函数
  • 7.8 插件
  • 7.9 字符集和校对
  • 7.9.1 MySQL 如何使用字符集
  • 7.9.2 选择字符集和校对规则
  • 7.9.3 字符集和校对规则如何影响查询
  • 7.10 全文索引
  • 7.10.1 自然语言的全文索引
  • 7.10.2 布尔全文索引
  • 7.10.3 MySQL5.1 中全文索引的变化
  • 7.10.4 全文索引的限制和替代方案
  • 7.10.5 全文索引的配置和优化
  • 7.11 分布式(XA)事务
  • 7.11.1 内部 XA 事务
  • 7.11.2 外部 XA 事务
  • 7.12 查询缓存
  • 7.12.1 MySQL 如何判断缓存命中
  • 7.12.2 查询缓存如何使用内存
  • 7.12.3 什么情况下查询缓存能发挥作用
  • 7.12.4 如何配置和维护查询缓存
  • 7.12.5 InnoDB 和查询缓存 .
  • 7.12.6 通用查询缓存优化
  • 7.12.7 查询缓存的替代方案
  • 7.13 总结

第 8 章 优化服务器设置

  • 8.1 MySQL 配置的工作原理
  • 8.1.1 语法、作用域和动态性
  • 8.1.2 设置变量的副作用
  • 8.1.3 入门
  • 8.1.4 通过基准测试迭代优化
  • 8.2 什么不该做
  • 8.3 创建 MySQL 配置文件
  • 8.3.1 检查 MySQL 服务器状态变量
  • 8.4 配置内存使用
  • 8.4.1 MySQL 可以使用多少内存?
  • 8.4.2 每个连接需要的内存 .
  • 8.4.3 为操作系统保留内存 .
  • 8.4.4 为缓存分配内存
  • 8.4.5 InnoDB 缓冲池(Buffer Pool)
  • 8.4.6 MyISAM 键缓存(Key Caches)
  • 8.4.7 线程缓存
  • 8.4.8 表缓存(Table Cache)
  • 8.4.9 InnoDB 数据字典(Data Dictionary)
  • 8.5 配置 MySQL 的 I/O 行为
  • 8.5.1 InnoDB I/O 配置
  • 8.5.2 MyISAM 的 I/O 配置 .
  • 8.6 配置 MySQL 并发 .
  • 8.6.1 InnoDB 并发配置
  • 8.6.2 MyISAM 并发配置
  • 8.7 基于工作负载的配置
  • 8.7.1 优化 BLOB 和 TEXT 的场景
  • 8.7.2 优化排序(Filesorts).
  • 8.8 完成基本配置
  • 8.9 安全和稳定的设置
  • 8.10 高级 InnoDB 设置
  • 8.11 总结

第 9 章 操作系统和硬件优化

  • 9.1 什么限制了 MySQL 的性能
  • 9.2 如何为 MySQL 选择 CPU
  • 9.2.1 哪个更好:更快的 CPU 还是更多的 CPU
  • 9.2.2 CPU 架构
  • 9.2.3 扩展到多个 CPU 和核心
  • 9.3 平衡内存和磁盘资源
  • 9.3.1 随机 I/O 和顺序 I/O
  • 9.3.2 缓存,读和写
  • 9.3.3 工作集是什么
  • 9.3.4 找到有效的内存 / 磁盘比例
  • 9.3.5 选择硬盘
  • 9.4 固态存储
  • 9.4.1 闪存概述
  • 9.4.2 闪存技术
  • 9.4.3 闪存的基准测试
  • 9.4.4 固态硬盘驱动器(SSD)
  • 9.4.5 PCIe 存储设备
  • 9.4.6 其他类型的固态存储 .
  • 9.4.7 什么时候应该使用闪存
  • 9.4.8 使用 Flashcache
  • 9.4.9 优化固态存储上的 MySQL
  • 9.5 为备库选择硬件
  • 9.6 RAID 性能优化
  • 9.6.1 RAID 的故障转移、恢复和镜像
  • 9.6.2 平衡硬件 RAID 和软件 RAID
  • 9.6.3 RAID 配置和缓存
  • 9.7 SAN 和 NAS
  • 9.7.1 SAN 基准测试
  • 9.7.2 使用基于 NFS 或 SMB 的 SAN
  • 9.7.3 MySQL 在 SAN 上的性能
  • 9.7.4 应该用 SAN 吗
  • 9.8 使用多磁盘卷
  • 9.9 网络配置
  • 9.10 选择操作系统
  • 9.11 选择文件系统
  • 9.12 选择磁盘队列调度策略
  • 9.13 线程
  • 9.14 内存交换区
  • 9.15 操作系统状态
  • 9.15.1 如何阅读 vmstat 的输出
  • 9.15.2 如何阅读 iostat 的输出
  • 9.15.3 其他有用的工具
  • 9.15.4 CPU 密集型的机器
  • 9.15.5 I/O 密集型的机器
  • 9.15.6 发生内存交换的机器
  • 9.15.7 空闲的机器
  • 9.16 总结

第 10 章 复制

  • 10.1 复制概述
  • 10.1.1 复制解决的问题
  • 10.1.2 复制如何工作
  • 10.2 配置复制
  • 10.2.1 创建复制账号
  • 10.2.2 配置主库和备库
  • 10.2.3 启动复制
  • 10.2.4 从另一个服务器开始复制
  • 10.2.5 推荐的复制配置
  • 10.3 复制的原理
  • 10.3.1 基于语句的复制
  • 10.3.2 基于行的复制
  • 10.3.3 基于行或基于语句:哪种更优
  • 10.3.4 复制文件
  • 10.3.5 发送复制事件到其他备库
  • 10.3.6 复制过滤器
  • 10.4 复制拓扑
  • 10.4.1 一主库多备库
  • 10.4.2 主动 - 主动模式下的主 - 主复制
  • 10.4.3 主动 - 被动模式下的主 - 主复制
  • 10.4.4 拥有备库的主 - 主结构
  • 10.4.5 环形复制
  • 10.4.6 主库、分发主库以及备库
  • 10.4.7 树或金字塔形
  • 10.4.8 定制的复制方案
  • 10.5 复制和容量规划
  • 10.5.1 为什么复制无法扩展写操作
  • 10.5.2 备库什么时候开始延迟
  • 10.5.3 规划冗余容量
  • 10.6 复制管理和维护
  • 10.6.1 监控复制
  • 10.6.2 测量备库延迟
  • 10.6.3 确定主备是否一致
  • 10.6.4 从主库重新同步备库
  • 10.6.5 改变主库
  • 10.6.6 在一个主 - 主配置中交换角色
  • 10.7 复制的问题和解决方案
  • 10.7.1 数据损坏或丢失的错误
  • 10.7.2 使用非事务型表
  • 10.7.3 混合事务型和非事务型表
  • 10.7.4 不确定语句
  • 10.7.5 主库和备库使用不同的存储引擎
  • 10.7.6 备库发生数据改变
  • 10.7.7 不唯一的服务器 ID .
  • 10.7.8 未定义的服务器 ID .
  • 10.7.9 对未复制数据的依赖性
  • 10.7.10 丢失的临时表
  • 10.7.11 不复制所有的更新 .
  • 10.7.12 InnoDB 加锁读引起的锁争用
  • 10.7.13 在主 - 主复制结构中写入两台主库
  • 10.7.14 过大的复制延迟
  • 10.7.15 来自主库的过大的包
  • 10.7.16 受限制的复制带宽 .
  • 10.7.17 磁盘空间不足
  • 10.7.18 复制的局限性
  • 10.8 复制有多快
  • 10.9 MySQL 复制的高级特性
  • 10.10 其他复制技术
  • 10.11 总结

第 11 章 可扩展的 MySQL

  • 11.1 什么是可扩展性
  • 11.1.1 正式的可扩展性定义
  • 11.2 扩展 MySQL
  • 11.2.1 规划可扩展性
  • 11.2.2 为扩展赢得时间
  • 11.2.3 向上扩展
  • 11.2.4 向外扩展
  • 11.2.5 通过多实例扩展
  • 11.2.6 通过集群扩展
  • 11.2.7 向内扩展
  • 11.3 负载均衡
  • 11.3.1 直接连接
  • 11.3.2 引入中间件
  • 11.3.3 一主多备间的负载均衡
  • 11.4 总结

第 12 章 高可用性

  • 12.1 什么是高可用性
  • 12.2 导致宕机的原因
  • 12.3 如何实现高可用性
  • 12.3.1 提升平均失效时间(MTBF)
  • 12.3.2 降低平均恢复时间(MTTR)
  • 12.4 避免单点失效
  • 12.4.1 共享存储或磁盘复制
  • 12.4.2 MySQL 同步复制
  • 12.4.3 基于复制的冗余
  • 12.5 故障转移和故障恢复
  • 12.5.1 提升备库或切换角色
  • 12.5.2 虚拟 IP 地址或 IP 接管
  • 12.5.3 中间件解决方案
  • 12.5.4 在应用中处理故障转移
  • 12.6 总结

第 13 章 云端的 MySQL

  • 13.1 云的优点、缺点和相关误解
  • 13.2 MySQL 在云端的经济价值
  • 13.3 云中的 MySQL 的可扩展性和高可用性
  • 13.4 四种基础资源
  • 13.5 MySQL 在云主机上的性能
  • 13.5.1 在云端的 MySQL 基准测试
  • 13.6 MySQL 数据库即服务(DBaaS)
  • 13.6.1 Amazon RDS
  • 13.6.2 其他 DBaaS 解决方案
  • 13.7 总结

第 14 章 应用层优化

  • 14.1 常见问题
  • 14.2 Web 服务器问题
  • 14.2.1 寻找最优并发度
  • 14.3 缓存
  • 14.3.1 应用层以下的缓存
  • 14.3.2 应用层缓存
  • 14.3.3 缓存控制策略
  • 14.3.4 缓存对象分层
  • 14.3.5 预生成内容
  • 14.3.6 作为基础组件的缓存
  • 14.3.7 使用 HandlerSocket 和 memcached
  • 14.4 拓展 MySQL
  • 14.5 MySQL 的替代品
  • 14.6 总结

第 15 章 备份与恢复

  • 15.1 为什么要备份
  • 15.2 定义恢复需求
  • 15.3 设计 MySQL 备份方案
  • 15.3.1 在线备份还是离线备份
  • 15.3.2 逻辑备份还是物理备份
  • 15.3.3 备份什么
  • 15.3.4 存储引擎和一致性
  • 15.4 管理和备份二进制日志
  • 15.4.1 二进制日志格式
  • 15.4.2 安全地清除老的二进制日志
  • 15.5 备份数据
  • 15.5.1 生成逻辑备份
  • 15.5.2 文件系统快照
  • 15.6 从备份中恢复
  • 15.6.1 恢复物理备份
  • 15.6.2 还原逻辑备份
  • 15.6.3 基于时间点的恢复
  • 15.6.4 更高级的恢复技术
  • 15.6.5 InnoDB 崩溃恢复
  • 15.7 备份和恢复工具
  • 15.7.1 MySQL Enterprise Backup
  • 15.7.2 Percona XtraBackup .
  • 15.7.3 mylvmbackup
  • 15.7.4 Zmanda Recovery Manager
  • 15.7.5 mydumper
  • 15.7.6 mysqldump.
  • 15.8 备份脚本化
  • 15.9 总结

第 16 章 MySQL 用户工具

  • 16.1 接口工具
  • 16.2 命令行工具集
  • 16.3 SQL 实用集
  • 16.4 监测工具
  • 16.4.1 开源的监控工具
  • 16.4.2 商业监控系统
  • 16.4.3 Innotop 的命令行监控
  • 16.5 总结

  • 附录 A MySQL 分支与变种

  • 附录 B MySQL 服务器状态

  • 附录 C 大文件传输

  • 附录 D EXPLAIN

  • 附录 E 锁的调试

  • 附录 F 在 MySQL 上使用 Sphinx

  • 索引

AXIHE / 精选教程

浏览全部教程

HTML

CSS

JS

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

如果你加我的私人微信,麻烦写上您的 称呼,所在地区,职业,方便我备注,谢谢


本站的微信公众号

阿西河前端教程

Anbang

安邦的私人微信

微信号: yaolushan

Anbang

Bilibili(B站)

朱安邦

Anbang