mysql基础技能与原理——基本原理

21
MySQL 基基基基基基基 ——基基基基 MySQL DBA Team 彭彭彭http://www.penglixun.com

Upload: michael-zhang

Post on 06-Dec-2014

2.361 views

Category:

Technology


8 download

DESCRIPTION

 

TRANSCRIPT

Page 1: MySQL基础技能与原理——基本原理

MySQL基础技能与原理——基本原理

MySQL DBA Team

彭立勋( http://www.penglixun.com )

Page 2: MySQL基础技能与原理——基本原理

内容概要

• 1. MySQL 体系架构• 2. InnoDB 特点• 3. MySQL 高级调优• 4. MySQL 复制原理• 5. MySQL 高级备份• 6. MySQL 关键代码实现分析

Page 3: MySQL基础技能与原理——基本原理

MySQL 体系架构

• MySQL 结构层次• MySQL 处理流程• 存储引擎机制

Page 4: MySQL基础技能与原理——基本原理

MySQL 结构层次

Page 5: MySQL基础技能与原理——基本原理

MySQL 处理流程当客户端链接上mysql服务端时,系统为其分配一个链接描述符 thd,用以描述客户端的所有信息,将作为参数在各个模块之间传递。一个典型的客户端查询在MySQL的主要模块之间的调用关系如图所示:

Page 6: MySQL基础技能与原理——基本原理

存储引擎机制

• MySQL 提供一个抽象层,允许不同的存储应请使用相同的 API 对表进行访问。该接口通过一个被称为 Handler 的抽象类来实现,该处理器提供了一些可实现基本操作的方法,入打开和关闭表,连续扫描记录,按照键值检索记录,存储记录以及删除记录。

• 每个存储引擎都执行处理器的一个子类以实现接口方法,以便将处理器操作转化为特定存储引擎的此层次存储 / 检索 API 调用

• MySQL 的主要存储引擎有: MyISAM( 非事务引擎 )/InnoDB( 事务引擎 )/Archive( 归档引擎 )/Memory( 内存引擎 )/NDB( 集群引擎 )

• 其他特殊引擎: Infobirght( 数据仓库引擎 )

Page 7: MySQL基础技能与原理——基本原理

InnoDB 特点

• 聚集索引• 行级锁• 数据文件

Page 8: MySQL基础技能与原理——基本原理

聚集索引

• InnoDB 实现两种 B+Tree 索引,一种是列值为 Key ,主键位置为 Value 即 ( 列值 , 主键位置 ) 的非主键索引( Secondary Index ),另一种是主键索引,两种索引的每个叶子节点都有一个双向指针分别指向前驱和后继节点。

• 主键索引即聚集索引( Cluster Index ),它不仅有主键,而且有主键所属的全部数据,所以在 InnoDB 中,主键索引即数据。

• 在 InnoDB 中,即使用户不指定主键, InnoDB 也会生成一个隐含主键,这种情况下, InnoDB 的性能比采用序列主键性能下降 30% 左右。

• 详细参考:《MySQL索引与存储方式对性能的影响》

• 《数据库算法与数据结构系列——B树相关》

Page 9: MySQL基础技能与原理——基本原理

聚集索引(图)

Page 10: MySQL基础技能与原理——基本原理

行级锁

• InnoDB 为了实现高并发,实现了一个行级锁。

• 不同于 Oracle 的行级锁, InnoDB 的行级锁是“间隙锁”,即如果操作 1 < col1 < 10 ,哪怕只有 col1=3 一条记录,在可重复读隔离级别下,也无法插入 col1=2 或 col1=4 等在 1~10 范围内的记录。

• InnoDB 的行级锁加在主键索引上,而不是加在数据块上。

• 详细参考:《 InnoDB行锁的实现分析》

Page 11: MySQL基础技能与原理——基本原理

数据文件

• InnoDB 的数据文件包括: ( innodb_file_per_table )• .frm 表结构文件• .ibd 表数据文件(数据目录)、系统元数据和 undo space (共享表空间)• ib_logfile* 重做日志文件,相当于 Oracle的 Redo Log

Page 12: MySQL基础技能与原理——基本原理

MySQL 高级调优

• 索引调整• 重要性能参数调整• 编译参数调优

Page 13: MySQL基础技能与原理——基本原理

索引调整

• 主键索引必须有,并且按要满足序列化,递增或者递减

• 索引合并:索引顺序不影响结果时,将可复用度高的字段放在索引的前面

• 主键排序无需索引:假设最后输出结果按主键排序,无需考虑主键字段加入索引, InnoDB 数据完全按主键顺序组织,最终取出数据既是按主键排序。

• 关联表存在关联字段和条件字段,优先将条件字段放在关联字段前建立组合索引。

• 实在无法避免的列运算但又需要很高的性能,可以通过新列和 Trigger (或程序实现)实现函数索引:《给MySQL “ ”做虚拟的 函数索引 》

Page 14: 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% 或者更小。如果脏页比例超

过这个参数,就会回写到磁盘。如果这个值太大,每次关闭就会有很多脏页需要回写。

Page 15: MySQL基础技能与原理——基本原理

编译参数调优• 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编译参数》

Page 16: MySQL基础技能与原理——基本原理

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 的两台主机没有相同的序列,就绝对不可能复制冲突。

Page 17: MySQL基础技能与原理——基本原理

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》

Page 18: MySQL基础技能与原理——基本原理

MySQL 关键代码实现分析

• 主要数据结构• 主要算法

Page 19: MySQL基础技能与原理——基本原理

主要数据结构

• THD 线程描述符( sql/sql_class.h )• 包含处理用户请求时需要的相关数据,每个连接会有一个线程来处理,在一些

高层函数中,此数据结构常被当作第一个参数传递。

• NET 网络连接描述符( sql/mysql_com.h )• 网络连接描述符,对内部数据包进行了封装,是 client和 server 之间的通信协议。

• TABLE 数据库表描述符( sql/table.h )• 数据库表描述符,分成 TABLE和 TABLE_SHARE 两部分。

• FIELD 字段描述符( sql/field.h )• 域描述符,是各种字段的抽象基类。

Page 20: MySQL基础技能与原理——基本原理

主要算法

• 排序算法:• MySQL排序采用 sort_buffer_size设定的线程独占内存进行排序,如果缓存里内放下要排序的数据,那么MySQL 会采取载入所有要返回的值进入缓存排序;如果缓存放不下,则把要排序的列放入缓存排序,然后再回表查询返回结果,如果依然放不下,就会采用归并排序,排好序的部分放入磁盘,载入未排好序的部分继续在内存中排序,然后和磁盘上的部分二路归并,直到排序全部完成。

• 详细参考:《数据库算法与数据结构系列——排序相关》• 连接算法:• MySQL 关联采用 join_buffer_size设定的线程独占内存进行 Join 操作, Join 过程

会采用下推算法,如果有 WHERE 条件, MySQL 会先进行过滤,然后才用关联字段去匹配被驱动表,这样可以有效减少参与关联的记录数。

• 详细参考:《MySQL LEFT/RIGHT JOIN算法效率分析》• 缓存算法:• MySQL缓存才用 LRU算法,由系统维护一个 LRU 双向链表。• 详细参考:《数据库算法与数据结构—— Cache&Buffer&Lock》

Page 21: MySQL基础技能与原理——基本原理

谢谢