SlideShare a Scribd company logo
MySQL 基础技能与原理 ——基本原理 MySQL DBA Team 彭立勋( http://www.penglixun.com )
内容概要 1. MySQL 体系架构 2. InnoDB 特点 3. MySQL 高级调优 4. MySQL 复制原理 5. MySQL 高级备份 6. MySQL 关键代码实现分析
MySQL 体系架构 MySQL 结构层次 MySQL 处理流程 存储引擎机制
MySQL 结构层次
MySQL 处理流程 当客户端链接上 mysql 服务端时,系统为其分配一个链接描述符 thd ,用以描述客户端的所有信息,将作为参数在各个模块之间传递。一个典型的客户端查询在 MySQL 的主要模块之间的调用关系如图所示:
存储引擎机制 MySQL 提供一个抽象层,允许不同的存储应请使用相同的 API 对表进行访问。该接口通过一个被称为 Handler 的抽象类来实现,该处理器提供了一些可实现基本操作的方法,入打开和关闭表,连续扫描记录,按照键值检索记录,存储记录以及删除记录。 每个存储引擎都执行处理器的一个子类以实现接口方法,以便将处理器操作转化为特定存储引擎的此层次存储 / 检索 API 调用 MySQL 的主要存储引擎有: MyISAM( 非事务引擎 )/InnoDB( 事务引擎 )/Archive( 归档引擎 )/Memory( 内存引擎 )/NDB( 集群引擎 ) 其他特殊引擎: Infobirght( 数据仓库引擎 )
InnoDB 特点 聚集索引 行级锁 数据文件
聚集索引 InnoDB 实现两种 B+Tree 索引,一种是列值为 Key ,主键位置为 Value 即  ( 列值 ,  主键位置 )  的非主键索引( Secondary Index ),另一种是主键索引,两种索引的每个叶子节点都有一个双向指针分别指向前驱和后继节点。 主键索引即聚集索引( Cluster Index ),它不仅有主键,而且有主键所属的全部数据,所以在 InnoDB 中, 主键索引即数据 。 在 InnoDB 中,即使用户不指定主键, InnoDB 也会生成一个隐含主键,这种情况下, InnoDB 的性能比采用序列主键性能下降 30% 左右。 详细参考:《 MySQL 索引与存储方式对性能的影响 》 《 数据库算法与数据结构系列 ——B 树相关 》
聚集索引(图)
行级锁 InnoDB 为了实现高并发,实现了一个行级锁。 不同于 Oracle 的行级锁, InnoDB 的行级锁是“间隙锁”,即如果操作  1  < col1 < 10 ,哪怕只有 col1=3 一条记录,在可重复读隔离级别下,也无法插入  col1=2  或  col1=4  等在 1~10 范围内的记录。 InnoDB 的行级锁加在主键索引上,而不是加在数据块上。 详细参考:《 InnoDB 行锁的实现分析 》
数据文件 InnoDB 的数据文件包括: ( innodb_file_per_table ) .frm  表结构文件 .ibd  表数据文件(数据目录)、系统元数据和 undo space (共享表空间) ib_logfile*  重做日志文件,相当于 Oracle 的 Redo Log
MySQL 高级调优 索引调整 重要性能参数调整 编译参数调优
索引调整 主键索引必须有,并且按要满足序列化,递增或者递减 索引合并:索引顺序不影响结果时,将可复用度高的字段放在索引的前面 主键排序无需索引:假设最后输出结果按主键排序,无需考虑主键字段加入索引, InnoDB 数据完全按主键顺序组织,最终取出数据既是按主键排序。 关联表存在关联字段和条件字段,优先将条件字段放在关联字段前建立组合索引。 实在无法避免的列运算但又需要很高的性能,可以通过新列和 Trigger (或程序实现)实现函数索引:《 给 MySQL 做虚拟的“函数索引” 》
重要性能参数调整 Sync_binlog 同步刷新 binlog 的秒数,设为 0 则交由操作系统自己刷新, MySQL 不强制刷新,除 0 外,数值越小性能越差 innodb_flush_log_at_trx_commit 0 性能最好,但无法保证数据安全,断电可能损失较多数据。 2 性能较好,但可能损失 1s 的数据。 1 性能最差,不丢失数据。 0 只保证日志刷新到文件,不保证刷新到磁盘, 2 保证每秒刷新到磁盘, 1 保证每次提交刷新到磁盘。 关于 Linux Cache 参考:《 Linux Cache  机制探究 》 innodb_max_dirty_pages_pct InnoDB Buffer Pool 中脏页的比例,建议设置为 3% 或者更小。如果脏页比例超过这个参数,就会回写到磁盘。如果这个值太大,每次关闭就会有很多脏页需要回写。
编译参数调优 GCC 参数(以 Xeon 55XX 系列 64 位系统为例) CXX=gcc CHOST=”x86_64-pc-linux-gnu”  CFLAGS=”-O3 -fomit-frame-pointer -pipe -march=nocona -mfpmath=sse -m128bit-long-double -mmmx -msse -msse2 -maccumulate-outgoing-args -m64 -ftree-loop-linear -fprefetch-loop-arrays -freg-struct-return -fgcse-sm -fgcse-las -frename-registers -fforce-addr -fivopts -ftree-vectorize -ftracer -frename-registers -minline-all-stringops -fbranch-target-load-optimize2″ CXXFLAGS=”${CFLAGS}”  MySQL 参数 ./configure –prefix=/usr/alibaba/install/mysql-ent-official-5.1.56 –with-server-suffix=alibaba-mysql –with-mysqld-user=mysql –with-plugins=partition,blackhole,csv,heap,innobase,myisam,myisammrg –with-charset=utf8 –with-collation=utf8_general_ci –with-extra-charsets=gbk,gb2312,utf8,ascii –with-big-tables –with-fast-mutexes –with-zlib-dir=bundled –enable-assembler –enable-profiling –enable-local-infile enable-thread-safe-client –with-readline –with-pthread –with-embedded-server –with-client-ldflags=-all-static –with-mysqld-ldflags=-all-static –without-query-cache –without-geometry –without-debug –without-ndb-debug 详细参考:《 适合 MySQL 的 Xeon 55XX 系列 CPU 编译参数 》
MySQL 复制原理 MySQL Replication 的基本原理是通过 binlog 复制应用的方式来还原数据。 MySQL 通过 Server_id 来识别 binlog 由哪台主机产生,因此即使双 Master 复制,也不会出现 binlog 被重复应用 复制线程分为 Slave IO 和 Slave SQL 两个, Slave IO 线程只负责注册到 Master 上,读取 binlog ,然后解析到本地, Slave SQL 线程只负责把 Slave IO 线程产生的可执行 SQL 应用到本地。 避免主键冲突, MySQL 提供了 auto_increment_increment 和 auto_increment_offset 来控制主键生成的序列,只要双 Master 的两台主机没有相同的序列,就绝对不可能复制冲突。
MySQL 高级备份 Xtrabckup 物理热备份 InnoDB 数据: “ innobackupex /data/backups”  就可以创建一个备份到 /data/backups 目录下,只要看到 “ completed OK!”  就是备份成功。 Xtrabckup 物理恢复 InnoDB 数据: “ Innobackupex --apply-log /data/backups/2010-09-08_11-25-44/” ,将数据文件处理为可以直接 copy 的内容 “ Innobackupex –copy-back/data/backups/2010-09-08_11-25-44/” ,将数据文件拷贝到 datadir ,从而恢复数据 原理: Xtrabckup 启动时,会对数据库加一个瞬时的锁,此时开始,数据库发生的所有 redo log 和 undo space 都会被 Xtrabckup 记录,同时还在拷贝 ibd 文件。当恢复的时候, Xtrabckup 先利用 InnoDB 源码中的恢复事务函数把当时时间点之后的数据回滚,然后就可以得到一个完整备份时拷贝,然后覆盖现有文件即可。 官方文档:《 XtraBackup Howto 》
MySQL 关键代码实现分析 主要数据结构 主要算法
主要数据结构 THD  线程描述符 ( sql/sql_class.h ) 包含处理用户请求时需要的相关数据,每个连接会有一个线程来处理,在一些高层函数中,此数据结构常被当作第一个参数传递。 NET  网络连接描述符 ( sql/mysql_com.h ) 网络连接描述符,对内部数据包进行了封装,是 client 和 server 之间的通信协议。 TABLE  数据库表描述符 ( sql/table.h ) 数据库表描述符,分成 TABLE 和 TABLE_SHARE 两部分。 FIELD  字段描述符 ( sql/field.h ) 域描述符,是各种字段的抽象基类。
主要算法 排序算法 : MySQL 排序采用 sort_buffer_size 设定的线程独占内存进行排序,如果缓存里内放下要排序的数据,那么 MySQL 会采取载入所有要返回的值进入缓存排序;如果缓存放不下,则把要排序的列放入缓存排序,然后再回表查询返回结果,如果依然放不下,就会采用归并排序,排好序的部分放入磁盘,载入未排好序的部分继续在内存中排序,然后和磁盘上的部分二路归并,直到排序全部完成。 详细参考:《 数据库算法与数据结构系列 —— 排序相关 》 连接算法: MySQL 关联采用 join_buffer_size 设定的线程独占内存进行 Join 操作, Join 过程会采用下推算法,如果有 WHERE 条件, MySQL 会先进行过滤,然后才用关联字段去匹配被驱动表,这样可以有效减少参与关联的记录数。 详细参考:《 MySQL LEFT/RIGHT JOIN 算法效率分析 》 缓存算法: MySQL 缓存才用 LRU 算法,由系统维护一个 LRU 双向链表。 详细参考:《 数据库算法与数据结构 ——Cache&Buffer&Lock 》
谢谢

More Related Content

What's hot (20)

PPT
MySQL基础技能与原理——基本原理
Michael Zhang
 
PPTX
MySQL aio
zhaolinjnu
 
PPT
Mysql展示功能与源码对应
zhaolinjnu
 
PDF
五款常用mysql slow log分析工具的比较
colderboy17
 
PDF
Mysql handlersocket
pwesh
 
PDF
MySQL快速入门与提高
mysqlpub
 
PPT
MySQL基础技能与原理——高级应用
Michael Zhang
 
PDF
Mysql proxy cluster
Yiwei Ma
 
DOC
MySQL 6.0 下的cluster + replicate - 20080220
Jinrong Ye
 
PPT
高性能并发Web服务器实现核心内幕
ideawu
 
ODP
CKAN 技術介紹 (基礎篇)
Chengjen Lee
 
PPT
摘星
zenyuhao
 
DOC
Mysql Replication
liufabin 66688
 
DOC
发布系统安装说明
Yiwei Ma
 
PPTX
Nginx共享内存
Lucien Li
 
DOC
Apache+php+mysql在Linux下的安装与配置
wensheng wei
 
PDF
高性能数据库
dhlzj
 
PDF
MIS MySQL 入門
均民 戴
 
DOC
My sql 同步
Yiwei Ma
 
PPTX
Redis介绍
zhaolinjnu
 
MySQL基础技能与原理——基本原理
Michael Zhang
 
MySQL aio
zhaolinjnu
 
Mysql展示功能与源码对应
zhaolinjnu
 
五款常用mysql slow log分析工具的比较
colderboy17
 
Mysql handlersocket
pwesh
 
MySQL快速入门与提高
mysqlpub
 
MySQL基础技能与原理——高级应用
Michael Zhang
 
Mysql proxy cluster
Yiwei Ma
 
MySQL 6.0 下的cluster + replicate - 20080220
Jinrong Ye
 
高性能并发Web服务器实现核心内幕
ideawu
 
CKAN 技術介紹 (基礎篇)
Chengjen Lee
 
摘星
zenyuhao
 
Mysql Replication
liufabin 66688
 
发布系统安装说明
Yiwei Ma
 
Nginx共享内存
Lucien Li
 
Apache+php+mysql在Linux下的安装与配置
wensheng wei
 
高性能数据库
dhlzj
 
MIS MySQL 入門
均民 戴
 
My sql 同步
Yiwei Ma
 
Redis介绍
zhaolinjnu
 

Viewers also liked (20)

PPT
内部MySQL培训.2.高级应用
Lixun Peng
 
PPT
内部MySQL培训.1.基础技能
Lixun Peng
 
PDF
DoubleBinlog方案
Lixun Peng
 
PDF
MySQL数据库开发的三十六条军规
mysqlops
 
PDF
Cabin Crew Analyst- Pitch Deck
Buzzlair Voufincci
 
PDF
Serving the Difference
thierry mortier
 
PDF
Prioritization to Production
Boaz Katz
 
PPTX
Naming conventions
Mao Hieng
 
PPSX
Piel de asno. Renarración de cuento clásico.
mdelcfp
 
PPTX
GraFiorio Portfolio
Gerardo Fiorio
 
PDF
Winter driving october 2013
Alan Bassett
 
PPTX
Scarecrow Festival at Thackley Methodist Church
thackley
 
PPT
Community, Coaching, Curation: New L&D roles
Brightwave Group
 
PDF
Expo Booking Form Wynyard
Alan Bassett
 
PDF
Red stripe 026a 16 lpb
Alan Bassett
 
PPTX
Sitecore. Digital Marketing System. Use Cases. Namics.
Namics – A Merkle Company
 
PDF
Mhw2011leaflet
Alan Bassett
 
PDF
Semioticians3
thierry mortier
 
PDF
Social Media for public administrations: opportunities and challenges
Alessandro Lovari
 
PDF
Demand More NESHEP October 2013 Meeting
Alan Bassett
 
内部MySQL培训.2.高级应用
Lixun Peng
 
内部MySQL培训.1.基础技能
Lixun Peng
 
DoubleBinlog方案
Lixun Peng
 
MySQL数据库开发的三十六条军规
mysqlops
 
Cabin Crew Analyst- Pitch Deck
Buzzlair Voufincci
 
Serving the Difference
thierry mortier
 
Prioritization to Production
Boaz Katz
 
Naming conventions
Mao Hieng
 
Piel de asno. Renarración de cuento clásico.
mdelcfp
 
GraFiorio Portfolio
Gerardo Fiorio
 
Winter driving october 2013
Alan Bassett
 
Scarecrow Festival at Thackley Methodist Church
thackley
 
Community, Coaching, Curation: New L&D roles
Brightwave Group
 
Expo Booking Form Wynyard
Alan Bassett
 
Red stripe 026a 16 lpb
Alan Bassett
 
Sitecore. Digital Marketing System. Use Cases. Namics.
Namics – A Merkle Company
 
Mhw2011leaflet
Alan Bassett
 
Semioticians3
thierry mortier
 
Social Media for public administrations: opportunities and challenges
Alessandro Lovari
 
Demand More NESHEP October 2013 Meeting
Alan Bassett
 
Ad

Similar to 内部MySQL培训.3.基本原理 (20)

PDF
2011 06-12-lamp-mysql
pwesh
 
PDF
2011 06-12-lamp-mysql-顾春江
thinkinlamp
 
PPT
My sql管理基础 李春_v2
Pickup Li
 
PPT
mysql总结
haiwang
 
PDF
MySQL技术分享:一步到位实现mysql优化
Jinrong Ye
 
PPSX
MySQL应用优化实践
mysqlops
 
PPSX
浅谈 My sql 性能调优
thinkinlamp
 
PPT
Mysql 培训-优化篇
sunmonth
 
DOC
1.基础篇 修改by徐定翔2 去掉批注
gavin shaw
 
PDF
浅谈 MySQL 性能调优
Sky Jian
 
PPT
第一讲 My sql初步
hjl888666
 
PDF
Mysql体系结构及原理(innodb)公开版
longxibendi
 
PPTX
My sql 5.6新特性深入剖析——innodb引擎
frogd
 
PPT
MySQL调优
moonbingbing
 
PDF
MySQL数据库设计、优化
Jinrong Ye
 
PPTX
Mysql调优
ken shin
 
PPTX
1到100000000 - 分布式大型网站的架构设计
RolfZhang
 
PDF
My sql cluster 基础
Sky Jian
 
PPT
Sina my sq概述及优化
pigso
 
PDF
1.mysql历史,体系结构与安装
雷 彻
 
2011 06-12-lamp-mysql
pwesh
 
2011 06-12-lamp-mysql-顾春江
thinkinlamp
 
My sql管理基础 李春_v2
Pickup Li
 
mysql总结
haiwang
 
MySQL技术分享:一步到位实现mysql优化
Jinrong Ye
 
MySQL应用优化实践
mysqlops
 
浅谈 My sql 性能调优
thinkinlamp
 
Mysql 培训-优化篇
sunmonth
 
1.基础篇 修改by徐定翔2 去掉批注
gavin shaw
 
浅谈 MySQL 性能调优
Sky Jian
 
第一讲 My sql初步
hjl888666
 
Mysql体系结构及原理(innodb)公开版
longxibendi
 
My sql 5.6新特性深入剖析——innodb引擎
frogd
 
MySQL调优
moonbingbing
 
MySQL数据库设计、优化
Jinrong Ye
 
Mysql调优
ken shin
 
1到100000000 - 分布式大型网站的架构设计
RolfZhang
 
My sql cluster 基础
Sky Jian
 
Sina my sq概述及优化
pigso
 
1.mysql历史,体系结构与安装
雷 彻
 
Ad

More from Lixun Peng (13)

PDF
Double Sync Replication
Lixun Peng
 
PDF
阿里云RDS for MySQL的若干优化
Lixun Peng
 
PPTX
Alibaba patches in MariaDB
Lixun Peng
 
PDF
Time Machine
Lixun Peng
 
PPTX
对MySQL的一些改进想法和实现
Lixun Peng
 
PDF
MySQL多机房容灾设计(with Multi-Master)
Lixun Peng
 
PDF
Performance of fractal tree databases
Lixun Peng
 
PDF
对简易几何机械化证明的进一步研究
Lixun Peng
 
PDF
A binary graphics recognition algorithm based on fitting function
Lixun Peng
 
DOC
一种基于拟合函数的图形识别算法
Lixun Peng
 
PDF
中文分词算法设计
Lixun Peng
 
PPT
DB_Algorithm_and_Data_Structure_About_Sort
Lixun Peng
 
PPT
DB_Algorithm_and_Data_Structure_About_BTree
Lixun Peng
 
Double Sync Replication
Lixun Peng
 
阿里云RDS for MySQL的若干优化
Lixun Peng
 
Alibaba patches in MariaDB
Lixun Peng
 
Time Machine
Lixun Peng
 
对MySQL的一些改进想法和实现
Lixun Peng
 
MySQL多机房容灾设计(with Multi-Master)
Lixun Peng
 
Performance of fractal tree databases
Lixun Peng
 
对简易几何机械化证明的进一步研究
Lixun Peng
 
A binary graphics recognition algorithm based on fitting function
Lixun Peng
 
一种基于拟合函数的图形识别算法
Lixun Peng
 
中文分词算法设计
Lixun Peng
 
DB_Algorithm_and_Data_Structure_About_Sort
Lixun Peng
 
DB_Algorithm_and_Data_Structure_About_BTree
Lixun Peng
 

内部MySQL培训.3.基本原理

  • 1. MySQL 基础技能与原理 ——基本原理 MySQL DBA Team 彭立勋( http://www.penglixun.com )
  • 2. 内容概要 1. MySQL 体系架构 2. InnoDB 特点 3. MySQL 高级调优 4. MySQL 复制原理 5. MySQL 高级备份 6. MySQL 关键代码实现分析
  • 3. MySQL 体系架构 MySQL 结构层次 MySQL 处理流程 存储引擎机制
  • 5. MySQL 处理流程 当客户端链接上 mysql 服务端时,系统为其分配一个链接描述符 thd ,用以描述客户端的所有信息,将作为参数在各个模块之间传递。一个典型的客户端查询在 MySQL 的主要模块之间的调用关系如图所示:
  • 6. 存储引擎机制 MySQL 提供一个抽象层,允许不同的存储应请使用相同的 API 对表进行访问。该接口通过一个被称为 Handler 的抽象类来实现,该处理器提供了一些可实现基本操作的方法,入打开和关闭表,连续扫描记录,按照键值检索记录,存储记录以及删除记录。 每个存储引擎都执行处理器的一个子类以实现接口方法,以便将处理器操作转化为特定存储引擎的此层次存储 / 检索 API 调用 MySQL 的主要存储引擎有: MyISAM( 非事务引擎 )/InnoDB( 事务引擎 )/Archive( 归档引擎 )/Memory( 内存引擎 )/NDB( 集群引擎 ) 其他特殊引擎: Infobirght( 数据仓库引擎 )
  • 7. InnoDB 特点 聚集索引 行级锁 数据文件
  • 8. 聚集索引 InnoDB 实现两种 B+Tree 索引,一种是列值为 Key ,主键位置为 Value 即 ( 列值 , 主键位置 ) 的非主键索引( Secondary Index ),另一种是主键索引,两种索引的每个叶子节点都有一个双向指针分别指向前驱和后继节点。 主键索引即聚集索引( Cluster Index ),它不仅有主键,而且有主键所属的全部数据,所以在 InnoDB 中, 主键索引即数据 。 在 InnoDB 中,即使用户不指定主键, InnoDB 也会生成一个隐含主键,这种情况下, InnoDB 的性能比采用序列主键性能下降 30% 左右。 详细参考:《 MySQL 索引与存储方式对性能的影响 》 《 数据库算法与数据结构系列 ——B 树相关 》
  • 10. 行级锁 InnoDB 为了实现高并发,实现了一个行级锁。 不同于 Oracle 的行级锁, InnoDB 的行级锁是“间隙锁”,即如果操作 1 < col1 < 10 ,哪怕只有 col1=3 一条记录,在可重复读隔离级别下,也无法插入 col1=2 或 col1=4 等在 1~10 范围内的记录。 InnoDB 的行级锁加在主键索引上,而不是加在数据块上。 详细参考:《 InnoDB 行锁的实现分析 》
  • 11. 数据文件 InnoDB 的数据文件包括: ( innodb_file_per_table ) .frm 表结构文件 .ibd 表数据文件(数据目录)、系统元数据和 undo space (共享表空间) ib_logfile* 重做日志文件,相当于 Oracle 的 Redo Log
  • 12. MySQL 高级调优 索引调整 重要性能参数调整 编译参数调优
  • 13. 索引调整 主键索引必须有,并且按要满足序列化,递增或者递减 索引合并:索引顺序不影响结果时,将可复用度高的字段放在索引的前面 主键排序无需索引:假设最后输出结果按主键排序,无需考虑主键字段加入索引, InnoDB 数据完全按主键顺序组织,最终取出数据既是按主键排序。 关联表存在关联字段和条件字段,优先将条件字段放在关联字段前建立组合索引。 实在无法避免的列运算但又需要很高的性能,可以通过新列和 Trigger (或程序实现)实现函数索引:《 给 MySQL 做虚拟的“函数索引” 》
  • 14. 重要性能参数调整 Sync_binlog 同步刷新 binlog 的秒数,设为 0 则交由操作系统自己刷新, MySQL 不强制刷新,除 0 外,数值越小性能越差 innodb_flush_log_at_trx_commit 0 性能最好,但无法保证数据安全,断电可能损失较多数据。 2 性能较好,但可能损失 1s 的数据。 1 性能最差,不丢失数据。 0 只保证日志刷新到文件,不保证刷新到磁盘, 2 保证每秒刷新到磁盘, 1 保证每次提交刷新到磁盘。 关于 Linux Cache 参考:《 Linux Cache 机制探究 》 innodb_max_dirty_pages_pct InnoDB Buffer Pool 中脏页的比例,建议设置为 3% 或者更小。如果脏页比例超过这个参数,就会回写到磁盘。如果这个值太大,每次关闭就会有很多脏页需要回写。
  • 15. 编译参数调优 GCC 参数(以 Xeon 55XX 系列 64 位系统为例) CXX=gcc CHOST=”x86_64-pc-linux-gnu” CFLAGS=”-O3 -fomit-frame-pointer -pipe -march=nocona -mfpmath=sse -m128bit-long-double -mmmx -msse -msse2 -maccumulate-outgoing-args -m64 -ftree-loop-linear -fprefetch-loop-arrays -freg-struct-return -fgcse-sm -fgcse-las -frename-registers -fforce-addr -fivopts -ftree-vectorize -ftracer -frename-registers -minline-all-stringops -fbranch-target-load-optimize2″ CXXFLAGS=”${CFLAGS}” MySQL 参数 ./configure –prefix=/usr/alibaba/install/mysql-ent-official-5.1.56 –with-server-suffix=alibaba-mysql –with-mysqld-user=mysql –with-plugins=partition,blackhole,csv,heap,innobase,myisam,myisammrg –with-charset=utf8 –with-collation=utf8_general_ci –with-extra-charsets=gbk,gb2312,utf8,ascii –with-big-tables –with-fast-mutexes –with-zlib-dir=bundled –enable-assembler –enable-profiling –enable-local-infile enable-thread-safe-client –with-readline –with-pthread –with-embedded-server –with-client-ldflags=-all-static –with-mysqld-ldflags=-all-static –without-query-cache –without-geometry –without-debug –without-ndb-debug 详细参考:《 适合 MySQL 的 Xeon 55XX 系列 CPU 编译参数 》
  • 16. MySQL 复制原理 MySQL Replication 的基本原理是通过 binlog 复制应用的方式来还原数据。 MySQL 通过 Server_id 来识别 binlog 由哪台主机产生,因此即使双 Master 复制,也不会出现 binlog 被重复应用 复制线程分为 Slave IO 和 Slave SQL 两个, Slave IO 线程只负责注册到 Master 上,读取 binlog ,然后解析到本地, Slave SQL 线程只负责把 Slave IO 线程产生的可执行 SQL 应用到本地。 避免主键冲突, MySQL 提供了 auto_increment_increment 和 auto_increment_offset 来控制主键生成的序列,只要双 Master 的两台主机没有相同的序列,就绝对不可能复制冲突。
  • 17. MySQL 高级备份 Xtrabckup 物理热备份 InnoDB 数据: “ innobackupex /data/backups” 就可以创建一个备份到 /data/backups 目录下,只要看到 “ completed OK!” 就是备份成功。 Xtrabckup 物理恢复 InnoDB 数据: “ Innobackupex --apply-log /data/backups/2010-09-08_11-25-44/” ,将数据文件处理为可以直接 copy 的内容 “ Innobackupex –copy-back/data/backups/2010-09-08_11-25-44/” ,将数据文件拷贝到 datadir ,从而恢复数据 原理: Xtrabckup 启动时,会对数据库加一个瞬时的锁,此时开始,数据库发生的所有 redo log 和 undo space 都会被 Xtrabckup 记录,同时还在拷贝 ibd 文件。当恢复的时候, Xtrabckup 先利用 InnoDB 源码中的恢复事务函数把当时时间点之后的数据回滚,然后就可以得到一个完整备份时拷贝,然后覆盖现有文件即可。 官方文档:《 XtraBackup Howto 》
  • 19. 主要数据结构 THD 线程描述符 ( sql/sql_class.h ) 包含处理用户请求时需要的相关数据,每个连接会有一个线程来处理,在一些高层函数中,此数据结构常被当作第一个参数传递。 NET 网络连接描述符 ( sql/mysql_com.h ) 网络连接描述符,对内部数据包进行了封装,是 client 和 server 之间的通信协议。 TABLE 数据库表描述符 ( sql/table.h ) 数据库表描述符,分成 TABLE 和 TABLE_SHARE 两部分。 FIELD 字段描述符 ( sql/field.h ) 域描述符,是各种字段的抽象基类。
  • 20. 主要算法 排序算法 : MySQL 排序采用 sort_buffer_size 设定的线程独占内存进行排序,如果缓存里内放下要排序的数据,那么 MySQL 会采取载入所有要返回的值进入缓存排序;如果缓存放不下,则把要排序的列放入缓存排序,然后再回表查询返回结果,如果依然放不下,就会采用归并排序,排好序的部分放入磁盘,载入未排好序的部分继续在内存中排序,然后和磁盘上的部分二路归并,直到排序全部完成。 详细参考:《 数据库算法与数据结构系列 —— 排序相关 》 连接算法: MySQL 关联采用 join_buffer_size 设定的线程独占内存进行 Join 操作, Join 过程会采用下推算法,如果有 WHERE 条件, MySQL 会先进行过滤,然后才用关联字段去匹配被驱动表,这样可以有效减少参与关联的记录数。 详细参考:《 MySQL LEFT/RIGHT JOIN 算法效率分析 》 缓存算法: MySQL 缓存才用 LRU 算法,由系统维护一个 LRU 双向链表。 详细参考:《 数据库算法与数据结构 ——Cache&Buffer&Lock 》