新書推薦:
![吴语百年面貌与变化研究——以嘉兴吴语为例](http://103.6.6.66/upload/mall/productImages/24/28/9787308236041.jpg)
《
吴语百年面貌与变化研究——以嘉兴吴语为例
》
售價:HK$
227.7
![众生百态:清代刑科题本里的“打工人”](http://103.6.6.66/upload/mall/productImages/24/27/9787500883791.jpg)
《
众生百态:清代刑科题本里的“打工人”
》
售價:HK$
66.7
![此间鸟兽:文物里的中华文明](http://103.6.6.66/upload/mall/productImages/24/26/9787576328592.jpg)
《
此间鸟兽:文物里的中华文明
》
售價:HK$
227.7
![史记百句(中华经典百句)](http://103.6.6.66/upload/mall/productImages/24/28/9787101166255.jpg)
《
史记百句(中华经典百句)
》
售價:HK$
56.4
![流年碎影(张中行先生88岁高龄写完的人生自传 “这一生我自认为不糊涂。”)](http://103.6.6.66/upload/mall/productImages/24/27/9787530222935.jpg)
《
流年碎影(张中行先生88岁高龄写完的人生自传 “这一生我自认为不糊涂。”)
》
售價:HK$
147.2
![经纬度丛书·迦太基帝国](http://103.6.6.66/upload/mall/productImages/24/28/9787213114816.jpg)
《
经纬度丛书·迦太基帝国
》
售價:HK$
66.7
![理想国译丛067:故国曾在:我的巴勒斯坦人生](http://103.6.6.66/upload/mall/productImages/24/27/9787509017937.jpg)
《
理想国译丛067:故国曾在:我的巴勒斯坦人生
》
售價:HK$
147.2
![心理创伤疗愈之道:倾听你身体的信号 [美]彼得·莱文](http://103.6.6.66/upload/mall/productImages/24/28/9787111746980.jpg)
《
心理创伤疗愈之道:倾听你身体的信号 [美]彼得·莱文
》
售價:HK$
102.4
|
編輯推薦: |
深入剖析MySQL数据库运行机制的优秀读物!更好、更快地帮助读者掌握MySQL专业技术知识!1.采用诙谐幽默的表达方式,全文采用大白话写成;2.作者画了200多幅图辅助讲解重点、细节内容,提供书中彩图文件下载;3.尊重用户体验:尝试根据用户认知顺序,使用更人性化的语言去解释看似很复杂的技术问题;4.层层铺垫的结构划分:本书覆盖的内容形成了一个闭环,看完本书希望读者能有一种看完整个故事的感觉;5.提供方便的答疑渠道:读者在学习过程中遇到的疑惑可以很快得到解答;6.尽管本书在写作时参考的MySQL源码版本是5.7.22,但是书中大部分知识与具体的MySQL版本并没有太大关系。偶有几处与特定版本相关的地方,本书也进行了明确强调;7.双色印刷。为什么这个SQL语句执行得这么慢?为什么我明明建立了索引,但是查询计划显示没用?为什么IN查询中的参数一多就不使用索引了?为什么我的数据显示成了乱码?……每一位DBA和后端开发人员在与MySQL打交道时,或多或少都会遇到这些问题。之外,索引结构、MVCC、隔离级别的实现、锁的使用等知识,也是求职人员在MySQL面试中躲不过去的高频问题。本书针对上面这些问
|
內容簡介: |
《MySQL是怎样运行的:从根儿上理解 MySQL》采用诙谐幽默的表达方式,对MySQL的底层运行原理进行了介绍,内容涵盖了使用MySQL的同学在求职面试和工作中常见的一些核心概念。总计22 章,划分为4个部分。第1部分介绍了MySQL入门的一些知识,比如MySQL的服务器程序和客户端程序有哪些、MySQL的启动选项和系统变量,以及使用的字符集等。第2部分是本书后续章节的基础,介绍了MySQL的一些基础知识,比如记录、页面、索引、表空间的结构和用法等。第3部分则与大家在工作中经常遇到的查询优化问题紧密相关,介绍了单表查询、连接查询的执行原理,MySQL基于成本和规则的优化具体指什么,并详细分析了Explain语句的执行结果。第4部分则是与MySQL中的事务和锁相关,介绍了事务概念的来源,MySQL是如何实现事务的,包括redo日志、undo日志、MVCC、各种锁的细节等。尽管《MySQL是怎样运行的:从根儿上理解 MySQL》在写作时参考的MySQL源代码版本是5.7.22,但是大部分内容与具体的版本号并没有多大关系。无论是很早之前就已身居MySQL专家的人员,还是希望进一步提升技能的DBA,甚至是三五年后才会入行的“萌新”,本书都是他们了解MySQL运行原理的优秀图书。
|
關於作者: |
毕业于西安建筑科技大学,曾在“跟谁学”做后端工程师。由于感到市场上的许多技术书籍晦涩难懂,决定离职研究如何把复杂问题讲清楚的学问。目前运营自媒体号【我们都是小青蛙】,输出大量原创技术文章。花费一年多的时间研究MySQL,梳理总结出《MySQL是怎样运行的:从根儿上理解MySQL》的图书,当前销量为8400多册。
|
目錄:
|
第0章 楔子——阅读前必看1第 1章 装作自己是个小白——初识MySQL 31.1 MySQL的客户端/服务器架构 31.2 MySQL的安装 31.3 启动MySQL服务器程序 51.3.1 在类UNIX系统中启动服务器程序 51.3.2 在Windows系统中启动服务器程序 61.4 启动MySQL客户端程序 71.5 客户端与服务器连接的过程 101.5.1 TCP/IP 101.5.2 命名管道和共享内存 101.5.3 UNIX域套接字 111.6 服务器处理客户端请求 111.6.1 连接管理 121.6.2 解析与优化 121.6.3 存储引擎 141.7 常用存储引擎 141.8 关于存储引擎的一些操作 161.8.1 查看当前服务器程序支持的存储引擎 161.8.2 设置表的存储引擎 161.9 总结 17第 2章 MySQL的调控按钮——启动选项和系统变量 192.1 启动选项和配置文件 192.1.1 在命令行上使用选项 192.1.2 配置文件中使用选项 212.1.3 在命令行和配置文件中启动选项的区别 262.2 系统变量 272.2.1 系统变量简介 272.2.2 查看系统变量 272.2.3 设置系统变量 282.3 状态变量 322.4 总结 32第3章 字符集和比较规则 343.1 字符集和比较规则简介 343.1.1 字符集简介 343.1.2 比较规则简介 343.1.3 一些重要的字符集 353.2 MySQL中支持的字符集和比较规则 363.2.1 MySQL中的utf8和utf8mb4 363.2.2 字符集的查看 363.2.3 比较规则的查看 383.3 字符集和比较规则的应用 393.3.1 各级别的字符集和比较规则 393.3.2 客户端和服务器通信过程中使用的字符集 443.3.3 比较规则的应用 523.4 总结 53第4章 从一条记录说起——InnoDB记录存储结构 554.1 准备工作 554.2 InnoDB页简介 554.3 InnoDB行格式 564.3.1 指定行格式的语法 564.3.2 COMPACT行格式 564.3.3 REDUNDANT行格式 644.3.4 溢出列 684.3.5 DYNAMIC行格式和COMPRESSED行格式 704.4 总结 71第5章 盛放记录的大盒子——InnoDB数据页结构 725.1 不同类型的页简介 725.2 数据页结构快览 725.3 记录在页中的存储 735.4 Page Directory(页目录) 805.5 Page Header(页面头部) 855.6 File Header(文件头部) 865.7 File Trailer(文件尾部) 885.8 总结 88第6章 快速查询的秘籍——B+树索引 906.1 没有索引时进行查找 906.1.1 在一个页中查找 906.1.2 在很多页中查找 916.2 索引 916.2.1 一个简单的索引方案 926.2.2 InnoDB中的索引方案 946.2.3 InnoDB中B+树索引的注意事项 1026.2.4 MyISAM中的索引方案简介 1046.2.5 MySQL中创建和删除索引的语句 1056.3 总结 106第7章 B+树索引的使用 1077.1 B+树索引示意图的简化 1077.2 索引的代价 1097.3 应用B+树索引 1107.3.1 扫描区间和边界条件 1107.3.2 索引用于排序 1227.3.3 索引用于分组 1257.4 回表的代价 1267.5 更好地创建和使用索引 1277.5.1 只为用于搜索、排序或分组的列创建索引 1277.5.2 考虑索引列中不重复值的个数 1277.5.3 索引列的类型尽量小 1277.5.4 为列前缀建立索引 1287.5.5 覆盖索引 1297.5.6 让索引列以列名的形式在搜索条件中单独出现 1297.5.7 新插入记录时主键大小对效率的影响 1297.5.8 冗余和重复索引 1307.6 总结 131第8章 数据的家——MySQL的数据目录 1328.1 数据库和文件系统的关系 1328.2 MySQL数据目录 1328.2.1 数据目录和安装目录的区别 1328.2.2 如何确定MySQL中的数据目录 1328.3 数据目录的结构 1338.3.1 数据库在文件系统中的表示 1338.3.2 表在文件系统中的表示 1348.3.3 其他的文件 1378.4 文件系统对数据库的影响 1378.5 MySQL系统数据库简介 1388.6 总结 138第9章 存放页面的大池子——InnoDB的表空间 1409.1 回忆一些旧知识 1409.1.1 页面类型 1409.1.2 页面通用部分 1419.2 独立表空间结构 1429.2.1 区的概念 1429.2.2 段的概念 1449.2.3 区的分类 1459.2.4 段的结构 1499.2.5 各类型页面详细情况 1509.2.6 Segment Header结构的运用 1569.2.7 真实表空间对应的文件大小 1579.3 系统表空间 1589.4 总结 164第 10章 条条大路通罗马——单表访问方法 16610.1 访问方法的概念 16710.2 const 16710.3 ref 16810.4 ref_or_null 17010.5 range 17110.6 index 17110.7 all 17210.8 注意事项 17210.8.1 重温二级索引+回表 17210.8.2 索引合并 17310.9 总结 177第 11章 两个表的亲密接触——连接的原理 17811.1 连接简介 17811.1.1 连接的本质 17811.1.2 连接过程简介 18011.1.3 内连接和外连接 18111.2 连接的原理 18511.2.1 嵌套循环连接 18611.2.2 使用索引加快连接速度 18711.2.3 基于块的嵌套循环连接 18811.3 总结 189第 12章 谁最便宜就选谁——基于成本的优化 19012.1 什么是成本 19012.2 单表查询的成本 19012.2.1 准备工作 19012.2.2 基于成本的优化步骤 19112.2.3 基于索引统计数据的成本计算 19812.3 连接查询的成本 20112.3.1 准备工作 20112.3.2 条件过滤(Condition Filtering) 20112.3.3 两表连接的成本分析 20312.3.4 多表连接的成本分析 20512.4 调节成本常数 20612.4.1 mysql.server_cost表 20612.4.2 mysql.engine_cost表 20812.5 总结 209第 13章 兵马未动,粮草先行——InnoDB统计数据是如何收集的 21013.1 统计数据的存储方式 21013.2 基于磁盘的永久性统计数据 21113.2.1 innodb_table_stats 21113.2.2 innodb_index_stats 21413.2.3 定期更新统计数据 21513.2.4 手动更新innodb_table_stats和innodb_index_stats表 21613.3 基于内存的非永久性统计数据 21713.4 innodb_stats_method的使用 21713.5 总结 219第 14章 基于规则的优化(内含子查询优化二三事) 22014.1 条件化简 22014.1.1 移除不必要的括号 22014.1.2 常量传递 22014.1.3 移除没用的条件 22114.1.4 表达式计算 22114.1.5 HAVING子句和WHERE子句的合并 22114.1.6 常量表检测 22114.2 外连接消除 22214.3 子查询优化 22414.3.1 子查询语法 22514.3.2 子查询在MySQL中是怎么执行的 23014.4 总结 244第 15章 查询优化的百科全书——EXPLAIN详解 24515.1 执行计划输出中各列详解 24615.1.1 table 24615.1.2 id 24715.1.3 select_type 24915.1.4 partitions 25215.1.5 type 25215.1.6 possible_keys和key 25515.1.7 key_len 25615.1.8 ref 25815.1.9 rows 25815.1.10 filtered 25915.1.11 Extra 26015.2 JSON格式的执行计划 26615.3 Extented EXPLAIN 26815.4 总结 269第 16章 神兵利器——optimizer trace的神奇功效 27016.1 optimizer trace简介 27016.2 通过optimizer trace分析查询优化器的具体工作过程 271第 17章 调节磁盘和CPU的矛盾——InnoDB的Buffer Pool 27817.1 缓存的重要性 27817.2 InnoDB的Buffer Pool 27817.2.1 啥是Buffer Pool 27817.2.2 Buffer Pool内部组成 27817.2.3 free链表的管理 27917.2.4 缓冲页的哈希处理 28017.2.5 flush链表的管理 28117.2.6 LRU链表的管理 28217.2.7 其他的一些链表 28617.2.8 刷新脏页到磁盘 28717.2.9 多个Buffer Pool实例 28717.2.10 innodb_buffer_pool_chunk_size 28817.2.11 配置Buffer Pool时的注意事项 28917.2.12 查看Buffer Pool的状态信息 29117.3 总结 293第 18章 从猫爷借钱说起——事务简介 29418.1 事务的起源 29418.1.1 原子性(Atomicity) 29518.1.2 隔离性(Isolation) 29518.1.3 一致性(Consistency) 29618.1.4 持久性(Durability) 29818.2 事务的概念 29818.3 MySQL中事务的语法 30018.3.1 开启事务 30018.3.2 提交事务 30118.3.3 手动中止事务 30218.3.4 支持事务的存储引擎 30218.3.5 自动提交 30318.3.6 隐式提交 30418.3.7 保存点 30518.4 总结 307第 19章 说过的话就一定要做到——redo日志 30819.1 事先说明 30819.2 redo日志是啥 30819.3 redo日志格式 30919.3.1 简单的redo日志类型 30919.3.2 复杂一些的redo日志类型 31119.3.3 redo日志格式小结 31419.4 Mini-Transaction 31519.4.1 以组的形式写入redo日志 31519.4.2 Mini-Transaction的概念 31919.5 redo日志的写入过程 31919.5.1 redo log block 31919.5.2 redo日志缓冲区 32019.5.3 redo日志写入log buffer 32119.6 redo日志文件 32319.6.1 redo日志刷盘时机 32319.6.2 redo日志文件组 32319.6.3 redo日志文件格式 32419.7 log sequence number 32719.7.1 flushed_to_disk_lsn 32819.7.2 lsn值和redo日志文件组中的偏移量的对应关系 33019.7.3 flush链表中的lsn 33019.8 checkpoint 33219.9 用户线程批量从flush链表中刷出脏页 33519.10 查看系统中的各种lsn值 33519.11 innodb_flush_log_at_trx_commit的用法 33619.12 崩溃恢复 33619.12.1 确定恢复的起点 33719.12.2 确定恢复的终点 33719.12.3 怎么恢复 33719.13 遗漏的问题:LOG_BLOCK_HDR_NO是如何计算的 33919.14 总结 340第 20章 后悔了怎么办——undo日志 34220.1 事务回滚的需求 34220.2 事务id 34320.2.1 分配事务id的时机 34320.2.2 事务id是怎么生成的 34320.2.3 trx_id隐藏列 34420.3 undo日志的格式 34420.3.1 INSERT操作对应的undo日志 34520.3.2 DELETE操作对应的undo日志 34720.3.3 UPDATE操作对应的undo日志 35320.3.4 增删改操作对二级索引的影响 35720.4 通用链表结构 35720.5 FIL_PAGE_UNDO_LOG页面 35920.6 Undo页面链表 36120.6.1 单个事务中的Undo页面链表 36120.6.2 多个事务中的Undo页面链表 36220.7 undo日志具体写入过程 36320.7.1 段的概念 36320.7.2 Undo Log Segment Header 36420.7.3 Undo Log Header 36520.7.4 小结 36720.8 重用Undo页面 36820.9 回滚段 36920.9.1 回滚段的概念 36920.9.2 从回滚段中申请Undo页面链表 37120.9.3 多个回滚段 37220.9.4 回滚段的分类 37420.9.5 roll_pointer的组成 37420.9.6 为事务分配Undo页面链表的详细过程 37520.10 回滚段相关配置 37620.10.1 配置回滚段数量 37620.10.2 配置undo表空间 37620.11 undo日志在崩溃恢复时的作用 37720.12 总结 377第 21章 一条记录的多副面孔——事务隔离级别和MVCC 37921.1 事前准备 37921.2 事务隔离级别 37921.2.1 事务并发执行时遇到的一致性问题 38221.2.2 SQL标准中的4种隔离级别 38521.2.3 MySQL中支持的4种隔离级别 38621.3 MVCC原理 38821.3.1 版本链 38821.3.2 ReadView 39021.3.3 二级索引与MVCC 39721.3.4 MVCC小结 39721.4 关于purge 39821.5 总结 399第 22章 工作面试老大难——锁 40122.1 解决并发事务带来问题的两种基本方式 40122.1.1 写-写情况 40122.1.2 读-写或写-读情况 40322.1.3 一致性读 40422.1.4 锁定读 40422.1.5 写操作 40522.2 多粒度锁 40622.3 MySQL中的行锁和表锁 40822.3.1 其他存储引擎中的锁 40822.3.2 InnoDB存储引擎中的锁 40922.3.3 InnoDB锁的内存结构 41722.4 语句加锁分析 42322.4.1 普通的SELECT语句 42322.4.2 锁定读的语句 42422.4.3 半一致性读的语句 44122.4.4 INSERT语句 44222.5 查看事务加锁情况 44422.5.1 使用information_schema数据库中的表获取锁信息 44422.5.2 使用SHOW ENINGE INNODB STATUS获取锁信息 44622.6 死锁 45022.7 总结 454参考资料 455
|
|