Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

6,958 views

Published on

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

Published in: Technology
  • Dating direct: ♥♥♥ http://bit.ly/39sFWPG ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating for everyone is here: ❤❤❤ http://bit.ly/39sFWPG ❤❤❤
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

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

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

×