SlideShare a Scribd company logo
1 of 31
Download to read offline
MySQL       (innodb)
MySQL体系结构及原理(innodb)




     http://blog.csdn.net/longxibendi
宏观认识




六个问题:


1.   delete      table_name速度, 3MB/S 左右
1.为什么delete from table_name




alter一张表,有多快呢?rename 呢?
宏观认识




六个问题:




2.为什么innodb 系统io
2.   innodb   io
              io能力为 200




1.本文所有内容,围绕mysql 5.1版本。Innodb版本为plugin版本。
宏观认识




六个问题:




3.
3.为什么机械磁盘的iops <=180
          iops

1.为什么移动硬盘,在copy数据,声音很大。有人用ssd的移动硬盘么?U盘没声音?
宏观认识




六个问题:




4.Insert          io
4.Insert一条记录,会产生物理io
                  io读操作么?




1.Update呢,会有物理读io操作么..
宏观认识




六个问题:




5.merge 为什么只适用于非唯一索引的insert
                     insert
                     insert?




INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 738, free list len 16770, seg size 17509,
28472919 inserts, 28349854 merged recs, 15294548 merges
宏观认识




六个问题:




6.                 NULL
6.为什么建立索引的字段,不允许默认为NULL
                   NULL?
宏观认识




应用程序      mysql、dbproxy


OS linux、windows、unix、mac


硬件     内存、CPU、外设、系统(数据)总线、网卡


环境     网络环境、上下游环境

1.每一层出现问题,都有可能导致整个系统异常。
2.系统的处理能力,取决于每一层自身的处理能力。
宏观认识


外存储分类:机械磁盘(磁介质)、电介质存储
          (   )

存储的性能

吞吐量                     衡量顺序读、写能力 。每秒,读写量大小。
MB/S
IOPS(吞吐率)         衡量随机读、写能力 。每秒,IO次数。IOPS

OLAP系统,顺序读写需求高。看吞吐量。iqiyi.com。视频网站。
OLTP系统,随机读写需求高。看IOPS。baifubai.com。数据库系统。

每秒,顺序读写量远远大于随机读写量。
思考:
  如何测试,随机读写、顺序读写?
  15K RPM SAS盘,15K/60=250转/秒


1.Innodb为什么要存2份数据。事务日志和ibd?
2.oltp数据库设计只因数据库随机io不给力?
宏观认识




存储的性能




       普通机械硬盘                   SSD
         结构图




                  FusionIO
                iodrive/PCI-E
宏观认识

                设备                             IOPS         接口

7200 RPM SATA drives               ~90 IOPS                SATA II

15k RPM SCSI drives                ~180 IOPS               SAS

Intel X25-M G2 (MLC)               ~8,600 IOPS             SATA II

ioDrive, a PCI-Express card with   with Flash 140,000 Read PCIe
Flash                              IOPS, 135,000 Write
                                   IOPS 




Fusion-io ioDrive Octal            1,180,000+ Random       PCIe
                                   Read/Write IOPS
宏观认识


存储的性能
宏观认识


存储的性能




1.10K,2.5寸,sas盘,随机iops,能跑到300么?
2.拍桌子,计算,还是测试?
宏观认识




1.存储的读写能力,受限于存储的自身处理能力。
2.就整个系统而言,同样受限于接口的吞吐。
3.write through 模式,5块ssd,做raid5,RAID卡是否能发挥效率,还是会拖后腿,成为瓶颈。
MySQL体系结构




1.SELECT userna FROM fc.userinfo WHERE pa=2;如果query_cache命中; 该sql有没有进入语法解析流程?
2.Innodb做语法解析了么?
MySQL体系结构
MySQL体系结构




                                  内存



                                              innodb buffer pool
mysql –uuser_name –puser_passwd
     –h 10.290.38.25 –P9598




                                                   各种处理线程




                                  磁盘

                                       数据文件                   日志


      用户 client                               mysqld server
MySQL体系结构



 内存
      query cache
                           innodb_additional_mem                 innodb buffer pool
                                   _pool
                                                                         insert
      key_buffer             innodb_log_buffer         data page                           锁信息
                                                                         buffer
             per-thread buffers
                                                         index         自适应哈
       sort_buffer         read_buffer                   page          希索引

       join_buffer         binlog cache



 连接         io /dump/sql          锁监控      错误监     master        insert buffer      log      read     write
 线程             thread            线程       控线程      线程              thread        thread    thread   thread




 relaylo
              binlog          error log          全日制        slow log              ibd*        ib_logfile
    g
MySQL体系结构



 内存
                      innodb_additional_mem                       innodb buffer pool
                              _pool
                                                                          insert
                         innodb_log_buffer              data page                           锁信息
                                                                          buffer

                                                          index         自适应哈
                                                          page          希索引


                           锁监控         错误监           master       insert buffer      log      read     write
                           线程          控线程            线程             thread        thread    thread   thread



      系统表空间                          独立表空间                                        事务日志

系统表空间:ibdata1、 ibdata2                       innodb_data_file_path=ibdata1:500M;ibdata2:50M:autoextend
独立表空间: id_user.ibd 、id_user.frm              innodb_file_per_table
事物日志:     ib_logfile0 、ib_logfile1
MySQL体系结构



 内存

                                             innodb buffer pool




      系统表空间                  独立表空间                     事务日志




系统表空间:insert buffer、doubel write、数据字典、undo
独立表空间:表数据、索引




1.insert buffer在内存中,还是在磁盘中?
2.聚集索引、非聚集索引在磁盘中?自适应hash在磁盘中?
Innodb有几个线程



                  锁监控        错误监     master   insert buffer     log     read     write
                   线程        控线程      线程         thread       thread   thread   thread



Innodb内部,有loop   ,background loop   ,flush loop ,suspend loop 等后台循环。
master_thread(){
             goto loop;
loop:
for (i=0;i<10;i++){
             thread_sleep(1);
             do log buffer flush;
             if (last_one_second_ios<5% innodb_io_capacity)
                           do merge 5% insert buffer
              if (modified_pct>dirty_pct)
                           do buffer pool flush 100%
             else if
                   if当前所需的dirty page flush
                                 dirty      flush速度大于过去20s20s
                                                          20s平均的刷脏页的速度,
                           do buffer pool flush 100%
             if (no user activity)
                           goto background loop
             }
}
If (last_ten_second_ios<innodb_io_capacity)
             do buffer pool flush 100%
do merge 5% insert buffer
do log bufer flush;
do full purge; undo page 删除。
If (modified_pct> 70%)
             do buffer pool flush 100%;
else
             do buffer pool flush 10%;
do fuzzy checkpoint
goto loop
background loop:
do full purge ;
do merge 100% insert buffer
If not idle:
goto loop:
else
             goto flush loop;

flush loop:
do buffer pool flush 100% dirty page
If (modified_pct>max_dirty_pct)
             go to flush loop;
goto suspend loop;

suspend loop:
suspend_thread()
waiting event
goto loop:
}



1.checkpoint到底是干啥的,可不可以没有checkpoint? mysql的checkpoint分类。
2.redo&undo的区别,到底是什么?
3.mysql的停、启过程?
表结构:
 CREATE TABLE `test_user_id`
(
  `id` bigint(20) NOT NULL ,
  `UserName` varchar(40) NOT NULL,
    PRIMARY KEY (`id`),
    KEY `index_UserName` (`UserName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

索引:
Key_name              Column_name           Index_type

PRIMARY                 id                   BTREE
Index_UserName        index_UserName         BTREE

执行下面的语句:
UPDATE test_user_id SET UserName= ‘dbs’ WHERE id=168;
                         UserName=‘ dbs’
INSERT into test_user_id values ( 9988, ’不停服、不宕机’);
                                  9988,’            ’



需要更新 几个索引?
有没有物理io
     io   ?
     io读操作?
MySQL体系结构



 内存
                     innodb buffer pool
              data           insert
             pages           buffer

                                                             innodb_log_buffer




                                          读取需要修改的page




      共享表空间                       独立表空间                          事务日志


1.如果需要修改的page,在内存中(自适应hash),则直接修改该page即可。否则需要执行一个物理读io,读取
page。
2.修改page,并产生undo。
3.事物,commit之后,redo会刷盘。(顺序io) (写事物日志)
4.对于insert操作,因为有KEY `index_UserName` (`UserName`),该索引的更新,可以等待merge。本次写入insert
buffer (顺序io) (写系统表空间,insert buffer)。对primary key的insert,与1类似。
5.修改后的page,写入到double write buffer中。(之后刷盘,会顺序io) (写系统表空间)
MySQL体系结构

undo & redo :

start transaction;
UPDATE test_user_id SET UserName= ‘dbs’ WHERE id=168;
                        UserName=‘ dbs’                 未提交, 产生undo
                                                               undo    rollback
                                                               undo。可用于rollback
                                                                       rollback。

commit ;   产生    redo log ,可用于重做。


mysql 启动:
1. 读取事物日志,获取最近的checkpoint .

2.遍历系统表空间,获取double_write,检查页面,
  同步数据 到独立表空间。

3.遍历该checkpoint后的事物,重做数据。                               checkpoint at 398 3301091314
  根据[space_id,page_no]及data,执行redo .                    LSN 398 3301091315 space_id page_no   dataxxxx
  读取事物日志,及表数据文件对应的page到内存。                              LSN 399 1755046031 space_id page_no   dataxxxx
  将事物日志中的data,应用到数据文件中。                                 LSN 399 2555046031 space_id page_no   dataxxxx

4.读取数据字典信息。初始化到内存中。

5.遍历系统表空间,读取undo,执行rollback。

6.启动master 等innodb 线程。
MySQL体系结构



mysql checkpoint:
1. sharp checkpoint   mysql shutdown使用,会刷所有dirty page到磁盘。
2. fuzzy checkpoint   每10s,执行,只刷oldestLSN之前的page到磁盘。




                                                            innodb_log_buffer




                      独立表空间                                   事务日志
MySQL体系结构




1.   delete      table_name速度, 3MB/S 左右
1.为什么delete from table_name
2.为什么innodb 系统io
2.   innodb   io
              io能力为 200
3.        iops
3.为什么机械磁盘的iops <=180
4.Insert          io
4.Insert一条记录,会产生物理io
                  io读操作么?
5.merge 为什么只适用于非唯一索引的insert
                     insert
                     insert?
6.                 NULL
6.为什么建立索引的字段,不允许默认为NULL
                   NULL?


1. Xtrabackup 的增量备份,能不能每天完成一次增量备份。
MySQL体系结构




1.   query_cache 利弊。全局锁。
2.   自适应hash索引的利弊。
3.   多个子系统合并。Innodb_buffer_pool 被不断清理。 innodb_old_blocks_time。
4.   事务日志全局锁,底层并发写为1。
5.   大批量插入/更新大数据,表空间自动扩展,表空间全局锁。
MySQL体系结构


innodb_flush_log_at_trx_commit


当被 设置为0,日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新,但是在一个事务
提交不做任何操作。
当这个值为1(默认值)之时,在每个事务提交时,日志缓冲被写到日志文件,对日志文件做到磁盘操作的 刷
新。
当设置为2之时,在每个提交,日志缓冲被写到文件,但不对日志文件做到磁盘操作的刷新。尽管如此,在对
日志文件的刷新在值为2的情况也每秒发生一次。

我们必须注意到,因为进程安排问题,每秒一次的 刷新不是100%保证每秒都发生。你可以通过设置这个值不
为1来获得较好的性能,但随之你会在一次崩溃中损失二分之一价值的事务。如果你设置这个值为0,那么任何
mysqld
mysqld进程的崩溃会删除崩溃前最后一秒的事务,如果你设置这个值为2,那么只有操作系统崩溃或掉电才会
删除最后一秒的事务。

尽管如此,InnoDB的崩溃恢复不受影响,而且因为这样崩溃恢复开始作用而不考虑这个值。注意,许多操作系
统和一些磁盘硬件会欺骗 刷新到磁盘操作。尽管刷新没有进行,你可以告诉mysqld
                                     mysqld
                                     mysqld刷新已经进行。即使设置
这个值为1,事务的持久程度不被保证,且在最坏情况下掉电甚至会破坏InnoDB数据库。在SCSI磁盘控制器中,
或在磁盘自身中,使用有后备电池的磁盘缓存会加速文件 刷新并且使得操作更安全。你也可以试着使用Unix
命令hdparm
   hdparm来在硬件缓存中禁止磁盘写缓存,或使用其它一些对硬件提供商专用的命令。这个选项的 默认值
  hdparm
是1。


 1. 多级cache。mysql -> 文件系统 ->raid
谢谢

More Related Content

What's hot

Showinnodbstatus公开
Showinnodbstatus公开Showinnodbstatus公开
Showinnodbstatus公开longxibendi
 
MySQL查询优化浅析
MySQL查询优化浅析MySQL查询优化浅析
MySQL查询优化浅析frogd
 
Mongo db部署架构之优先方案
Mongo db部署架构之优先方案Mongo db部署架构之优先方案
Mongo db部署架构之优先方案Lucien Li
 
MySQL源码分析.01.代码结构与基本流程
MySQL源码分析.01.代码结构与基本流程MySQL源码分析.01.代码结构与基本流程
MySQL源码分析.01.代码结构与基本流程Lixun Peng
 
康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)Yiwei Ma
 
InnoDB Transaction Lock and MVCC
InnoDB Transaction Lock and MVCCInnoDB Transaction Lock and MVCC
InnoDB Transaction Lock and MVCCfrogd
 
Java应用性能测试与分析
Java应用性能测试与分析Java应用性能测试与分析
Java应用性能测试与分析Frank Lee
 
X64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 newX64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 newYiwei Ma
 
我对后端优化的一点想法.pptx
我对后端优化的一点想法.pptx我对后端优化的一点想法.pptx
我对后端优化的一点想法.pptxjames tong
 
MySQL 6.0 下的cluster + replicate - 20080220
MySQL 6.0 下的cluster + replicate - 20080220MySQL 6.0 下的cluster + replicate - 20080220
MySQL 6.0 下的cluster + replicate - 20080220Jinrong Ye
 
Oracle rac资源管理算法与cache fusion实现浅析
Oracle rac资源管理算法与cache fusion实现浅析Oracle rac资源管理算法与cache fusion实现浅析
Oracle rac资源管理算法与cache fusion实现浅析frogd
 
硬件体系架构浅析
硬件体系架构浅析硬件体系架构浅析
硬件体系架构浅析frogd
 
Mysql proxy+mysql-mmm
Mysql proxy+mysql-mmmMysql proxy+mysql-mmm
Mysql proxy+mysql-mmmYiwei Ma
 
Altibase管理培训 安装篇
Altibase管理培训 安装篇Altibase管理培训 安装篇
Altibase管理培训 安装篇小新 制造
 
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略maclean liu
 
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案maclean liu
 
利用Cent Os快速构建自己的发行版
利用Cent Os快速构建自己的发行版利用Cent Os快速构建自己的发行版
利用Cent Os快速构建自己的发行版xingsu1021
 
Tech.days Taiwan AZR305
Tech.days Taiwan AZR305 Tech.days Taiwan AZR305
Tech.days Taiwan AZR305 Jeff Chu
 

What's hot (20)

Showinnodbstatus公开
Showinnodbstatus公开Showinnodbstatus公开
Showinnodbstatus公开
 
MySQL查询优化浅析
MySQL查询优化浅析MySQL查询优化浅析
MySQL查询优化浅析
 
Mongo db部署架构之优先方案
Mongo db部署架构之优先方案Mongo db部署架构之优先方案
Mongo db部署架构之优先方案
 
MySQL源码分析.01.代码结构与基本流程
MySQL源码分析.01.代码结构与基本流程MySQL源码分析.01.代码结构与基本流程
MySQL源码分析.01.代码结构与基本流程
 
康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)
 
InnoDB Transaction Lock and MVCC
InnoDB Transaction Lock and MVCCInnoDB Transaction Lock and MVCC
InnoDB Transaction Lock and MVCC
 
Java应用性能测试与分析
Java应用性能测试与分析Java应用性能测试与分析
Java应用性能测试与分析
 
Mongodb学习手册
Mongodb学习手册Mongodb学习手册
Mongodb学习手册
 
X64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 newX64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 new
 
我对后端优化的一点想法.pptx
我对后端优化的一点想法.pptx我对后端优化的一点想法.pptx
我对后端优化的一点想法.pptx
 
MySQL 6.0 下的cluster + replicate - 20080220
MySQL 6.0 下的cluster + replicate - 20080220MySQL 6.0 下的cluster + replicate - 20080220
MySQL 6.0 下的cluster + replicate - 20080220
 
Oracle rac资源管理算法与cache fusion实现浅析
Oracle rac资源管理算法与cache fusion实现浅析Oracle rac资源管理算法与cache fusion实现浅析
Oracle rac资源管理算法与cache fusion实现浅析
 
硬件体系架构浅析
硬件体系架构浅析硬件体系架构浅析
硬件体系架构浅析
 
Mysql proxy+mysql-mmm
Mysql proxy+mysql-mmmMysql proxy+mysql-mmm
Mysql proxy+mysql-mmm
 
Altibase管理培训 安装篇
Altibase管理培训 安装篇Altibase管理培训 安装篇
Altibase管理培训 安装篇
 
Build Your Own Android Toolchain from scratch
Build Your Own Android Toolchain from scratchBuild Your Own Android Toolchain from scratch
Build Your Own Android Toolchain from scratch
 
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略
 
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
 
利用Cent Os快速构建自己的发行版
利用Cent Os快速构建自己的发行版利用Cent Os快速构建自己的发行版
利用Cent Os快速构建自己的发行版
 
Tech.days Taiwan AZR305
Tech.days Taiwan AZR305 Tech.days Taiwan AZR305
Tech.days Taiwan AZR305
 

Similar to Mysql体系结构及原理(innodb)公开版

对MySQL应用的一些总结
对MySQL应用的一些总结对MySQL应用的一些总结
对MySQL应用的一些总结Lixun Peng
 
MySQL新技术探索与实践
MySQL新技术探索与实践MySQL新技术探索与实践
MySQL新技术探索与实践Lixun Peng
 
My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎frogd
 
2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江thinkinlamp
 
2011 06-12-lamp-mysql
2011 06-12-lamp-mysql2011 06-12-lamp-mysql
2011 06-12-lamp-mysqlpwesh
 
S1: InnoDB AIO原理及相关bug分析
S1: InnoDB AIO原理及相关bug分析S1: InnoDB AIO原理及相关bug分析
S1: InnoDB AIO原理及相关bug分析Hui Liu
 
MySQL应用优化实践
MySQL应用优化实践MySQL应用优化实践
MySQL应用优化实践mysqlops
 
百度分布式数据库平台
百度分布式数据库平台百度分布式数据库平台
百度分布式数据库平台Wyatt Fang
 
百度分布式数据库 刘斌 Sacc2010
百度分布式数据库 刘斌 Sacc2010百度分布式数据库 刘斌 Sacc2010
百度分布式数据库 刘斌 Sacc2010Chuanying Du
 
Altibase管理培训 管理篇
Altibase管理培训 管理篇Altibase管理培训 管理篇
Altibase管理培训 管理篇小新 制造
 
Altibase管理培训 优化篇 v1.1
Altibase管理培训 优化篇 v1.1Altibase管理培训 优化篇 v1.1
Altibase管理培训 优化篇 v1.1小新 制造
 
mysql总结
mysql总结mysql总结
mysql总结haiwang
 
Buffer pool implementaion inno db vs oracle
Buffer pool implementaion inno db vs oracleBuffer pool implementaion inno db vs oracle
Buffer pool implementaion inno db vs oraclefrogd
 
淘宝商品库MySQL优化实践
淘宝商品库MySQL优化实践淘宝商品库MySQL优化实践
淘宝商品库MySQL优化实践Feng Yu
 
腾讯大讲堂19 系统优化的方向
腾讯大讲堂19 系统优化的方向腾讯大讲堂19 系统优化的方向
腾讯大讲堂19 系统优化的方向topgeek
 
腾讯大讲堂19 系统优化的方向
腾讯大讲堂19 系统优化的方向腾讯大讲堂19 系统优化的方向
腾讯大讲堂19 系统优化的方向areyouok
 
优酷 Web网站架构案例分析
优酷   Web网站架构案例分析优酷   Web网站架构案例分析
优酷 Web网站架构案例分析George Ang
 
Key value store
Key value storeKey value store
Key value storexuanhan863
 
Youku arch qcon2009_beijing
Youku arch qcon2009_beijingYouku arch qcon2009_beijing
Youku arch qcon2009_beijingdrewz lin
 

Similar to Mysql体系结构及原理(innodb)公开版 (20)

对MySQL应用的一些总结
对MySQL应用的一些总结对MySQL应用的一些总结
对MySQL应用的一些总结
 
MySQL新技术探索与实践
MySQL新技术探索与实践MySQL新技术探索与实践
MySQL新技术探索与实践
 
My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎
 
Sth About SSD
Sth About SSDSth About SSD
Sth About SSD
 
2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江
 
2011 06-12-lamp-mysql
2011 06-12-lamp-mysql2011 06-12-lamp-mysql
2011 06-12-lamp-mysql
 
S1: InnoDB AIO原理及相关bug分析
S1: InnoDB AIO原理及相关bug分析S1: InnoDB AIO原理及相关bug分析
S1: InnoDB AIO原理及相关bug分析
 
MySQL应用优化实践
MySQL应用优化实践MySQL应用优化实践
MySQL应用优化实践
 
百度分布式数据库平台
百度分布式数据库平台百度分布式数据库平台
百度分布式数据库平台
 
百度分布式数据库 刘斌 Sacc2010
百度分布式数据库 刘斌 Sacc2010百度分布式数据库 刘斌 Sacc2010
百度分布式数据库 刘斌 Sacc2010
 
Altibase管理培训 管理篇
Altibase管理培训 管理篇Altibase管理培训 管理篇
Altibase管理培训 管理篇
 
Altibase管理培训 优化篇 v1.1
Altibase管理培训 优化篇 v1.1Altibase管理培训 优化篇 v1.1
Altibase管理培训 优化篇 v1.1
 
mysql总结
mysql总结mysql总结
mysql总结
 
Buffer pool implementaion inno db vs oracle
Buffer pool implementaion inno db vs oracleBuffer pool implementaion inno db vs oracle
Buffer pool implementaion inno db vs oracle
 
淘宝商品库MySQL优化实践
淘宝商品库MySQL优化实践淘宝商品库MySQL优化实践
淘宝商品库MySQL优化实践
 
腾讯大讲堂19 系统优化的方向
腾讯大讲堂19 系统优化的方向腾讯大讲堂19 系统优化的方向
腾讯大讲堂19 系统优化的方向
 
腾讯大讲堂19 系统优化的方向
腾讯大讲堂19 系统优化的方向腾讯大讲堂19 系统优化的方向
腾讯大讲堂19 系统优化的方向
 
优酷 Web网站架构案例分析
优酷   Web网站架构案例分析优酷   Web网站架构案例分析
优酷 Web网站架构案例分析
 
Key value store
Key value storeKey value store
Key value store
 
Youku arch qcon2009_beijing
Youku arch qcon2009_beijingYouku arch qcon2009_beijing
Youku arch qcon2009_beijing
 

Mysql体系结构及原理(innodb)公开版

  • 1. MySQL (innodb) MySQL体系结构及原理(innodb) http://blog.csdn.net/longxibendi
  • 2. 宏观认识 六个问题: 1. delete table_name速度, 3MB/S 左右 1.为什么delete from table_name alter一张表,有多快呢?rename 呢?
  • 3. 宏观认识 六个问题: 2.为什么innodb 系统io 2. innodb io io能力为 200 1.本文所有内容,围绕mysql 5.1版本。Innodb版本为plugin版本。
  • 4. 宏观认识 六个问题: 3. 3.为什么机械磁盘的iops <=180 iops 1.为什么移动硬盘,在copy数据,声音很大。有人用ssd的移动硬盘么?U盘没声音?
  • 5. 宏观认识 六个问题: 4.Insert io 4.Insert一条记录,会产生物理io io读操作么? 1.Update呢,会有物理读io操作么..
  • 6. 宏观认识 六个问题: 5.merge 为什么只适用于非唯一索引的insert insert insert? INSERT BUFFER AND ADAPTIVE HASH INDEX ------------------------------------- Ibuf: size 738, free list len 16770, seg size 17509, 28472919 inserts, 28349854 merged recs, 15294548 merges
  • 7. 宏观认识 六个问题: 6. NULL 6.为什么建立索引的字段,不允许默认为NULL NULL?
  • 8. 宏观认识 应用程序 mysql、dbproxy OS linux、windows、unix、mac 硬件 内存、CPU、外设、系统(数据)总线、网卡 环境 网络环境、上下游环境 1.每一层出现问题,都有可能导致整个系统异常。 2.系统的处理能力,取决于每一层自身的处理能力。
  • 9. 宏观认识 外存储分类:机械磁盘(磁介质)、电介质存储 ( ) 存储的性能 吞吐量 衡量顺序读、写能力 。每秒,读写量大小。 MB/S IOPS(吞吐率) 衡量随机读、写能力 。每秒,IO次数。IOPS OLAP系统,顺序读写需求高。看吞吐量。iqiyi.com。视频网站。 OLTP系统,随机读写需求高。看IOPS。baifubai.com。数据库系统。 每秒,顺序读写量远远大于随机读写量。 思考: 如何测试,随机读写、顺序读写? 15K RPM SAS盘,15K/60=250转/秒 1.Innodb为什么要存2份数据。事务日志和ibd? 2.oltp数据库设计只因数据库随机io不给力?
  • 10. 宏观认识 存储的性能 普通机械硬盘 SSD 结构图 FusionIO iodrive/PCI-E
  • 11. 宏观认识 设备 IOPS 接口 7200 RPM SATA drives ~90 IOPS SATA II 15k RPM SCSI drives ~180 IOPS SAS Intel X25-M G2 (MLC) ~8,600 IOPS SATA II ioDrive, a PCI-Express card with with Flash 140,000 Read PCIe Flash IOPS, 135,000 Write IOPS  Fusion-io ioDrive Octal 1,180,000+ Random PCIe Read/Write IOPS
  • 15. MySQL体系结构 1.SELECT userna FROM fc.userinfo WHERE pa=2;如果query_cache命中; 该sql有没有进入语法解析流程? 2.Innodb做语法解析了么?
  • 17. MySQL体系结构 内存 innodb buffer pool mysql –uuser_name –puser_passwd –h 10.290.38.25 –P9598 各种处理线程 磁盘 数据文件 日志 用户 client mysqld server
  • 18. MySQL体系结构 内存 query cache innodb_additional_mem innodb buffer pool _pool insert key_buffer innodb_log_buffer data page 锁信息 buffer per-thread buffers index 自适应哈 sort_buffer read_buffer page 希索引 join_buffer binlog cache 连接 io /dump/sql 锁监控 错误监 master insert buffer log read write 线程 thread 线程 控线程 线程 thread thread thread thread relaylo binlog error log 全日制 slow log ibd* ib_logfile g
  • 19. MySQL体系结构 内存 innodb_additional_mem innodb buffer pool _pool insert innodb_log_buffer data page 锁信息 buffer index 自适应哈 page 希索引 锁监控 错误监 master insert buffer log read write 线程 控线程 线程 thread thread thread thread 系统表空间 独立表空间 事务日志 系统表空间:ibdata1、 ibdata2 innodb_data_file_path=ibdata1:500M;ibdata2:50M:autoextend 独立表空间: id_user.ibd 、id_user.frm innodb_file_per_table 事物日志: ib_logfile0 、ib_logfile1
  • 20. MySQL体系结构 内存 innodb buffer pool 系统表空间 独立表空间 事务日志 系统表空间:insert buffer、doubel write、数据字典、undo 独立表空间:表数据、索引 1.insert buffer在内存中,还是在磁盘中? 2.聚集索引、非聚集索引在磁盘中?自适应hash在磁盘中?
  • 21. Innodb有几个线程 锁监控 错误监 master insert buffer log read write 线程 控线程 线程 thread thread thread thread Innodb内部,有loop ,background loop ,flush loop ,suspend loop 等后台循环。
  • 22. master_thread(){ goto loop; loop: for (i=0;i<10;i++){ thread_sleep(1); do log buffer flush; if (last_one_second_ios<5% innodb_io_capacity) do merge 5% insert buffer if (modified_pct>dirty_pct) do buffer pool flush 100% else if if当前所需的dirty page flush dirty flush速度大于过去20s20s 20s平均的刷脏页的速度, do buffer pool flush 100% if (no user activity) goto background loop } } If (last_ten_second_ios<innodb_io_capacity) do buffer pool flush 100% do merge 5% insert buffer do log bufer flush; do full purge; undo page 删除。 If (modified_pct> 70%) do buffer pool flush 100%; else do buffer pool flush 10%; do fuzzy checkpoint goto loop
  • 23. background loop: do full purge ; do merge 100% insert buffer If not idle: goto loop: else goto flush loop; flush loop: do buffer pool flush 100% dirty page If (modified_pct>max_dirty_pct) go to flush loop; goto suspend loop; suspend loop: suspend_thread() waiting event goto loop: } 1.checkpoint到底是干啥的,可不可以没有checkpoint? mysql的checkpoint分类。 2.redo&undo的区别,到底是什么? 3.mysql的停、启过程?
  • 24. 表结构: CREATE TABLE `test_user_id` ( `id` bigint(20) NOT NULL , `UserName` varchar(40) NOT NULL, PRIMARY KEY (`id`), KEY `index_UserName` (`UserName`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 索引: Key_name Column_name Index_type PRIMARY id BTREE Index_UserName index_UserName BTREE 执行下面的语句: UPDATE test_user_id SET UserName= ‘dbs’ WHERE id=168; UserName=‘ dbs’ INSERT into test_user_id values ( 9988, ’不停服、不宕机’); 9988,’ ’ 需要更新 几个索引? 有没有物理io io ? io读操作?
  • 25. MySQL体系结构 内存 innodb buffer pool data insert pages buffer innodb_log_buffer 读取需要修改的page 共享表空间 独立表空间 事务日志 1.如果需要修改的page,在内存中(自适应hash),则直接修改该page即可。否则需要执行一个物理读io,读取 page。 2.修改page,并产生undo。 3.事物,commit之后,redo会刷盘。(顺序io) (写事物日志) 4.对于insert操作,因为有KEY `index_UserName` (`UserName`),该索引的更新,可以等待merge。本次写入insert buffer (顺序io) (写系统表空间,insert buffer)。对primary key的insert,与1类似。 5.修改后的page,写入到double write buffer中。(之后刷盘,会顺序io) (写系统表空间)
  • 26. MySQL体系结构 undo & redo : start transaction; UPDATE test_user_id SET UserName= ‘dbs’ WHERE id=168; UserName=‘ dbs’ 未提交, 产生undo undo rollback undo。可用于rollback rollback。 commit ; 产生 redo log ,可用于重做。 mysql 启动: 1. 读取事物日志,获取最近的checkpoint . 2.遍历系统表空间,获取double_write,检查页面, 同步数据 到独立表空间。 3.遍历该checkpoint后的事物,重做数据。 checkpoint at 398 3301091314 根据[space_id,page_no]及data,执行redo . LSN 398 3301091315 space_id page_no dataxxxx 读取事物日志,及表数据文件对应的page到内存。 LSN 399 1755046031 space_id page_no dataxxxx 将事物日志中的data,应用到数据文件中。 LSN 399 2555046031 space_id page_no dataxxxx 4.读取数据字典信息。初始化到内存中。 5.遍历系统表空间,读取undo,执行rollback。 6.启动master 等innodb 线程。
  • 27. MySQL体系结构 mysql checkpoint: 1. sharp checkpoint mysql shutdown使用,会刷所有dirty page到磁盘。 2. fuzzy checkpoint 每10s,执行,只刷oldestLSN之前的page到磁盘。 innodb_log_buffer 独立表空间 事务日志
  • 28. MySQL体系结构 1. delete table_name速度, 3MB/S 左右 1.为什么delete from table_name 2.为什么innodb 系统io 2. innodb io io能力为 200 3. iops 3.为什么机械磁盘的iops <=180 4.Insert io 4.Insert一条记录,会产生物理io io读操作么? 5.merge 为什么只适用于非唯一索引的insert insert insert? 6. NULL 6.为什么建立索引的字段,不允许默认为NULL NULL? 1. Xtrabackup 的增量备份,能不能每天完成一次增量备份。
  • 29. MySQL体系结构 1. query_cache 利弊。全局锁。 2. 自适应hash索引的利弊。 3. 多个子系统合并。Innodb_buffer_pool 被不断清理。 innodb_old_blocks_time。 4. 事务日志全局锁,底层并发写为1。 5. 大批量插入/更新大数据,表空间自动扩展,表空间全局锁。
  • 30. MySQL体系结构 innodb_flush_log_at_trx_commit 当被 设置为0,日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新,但是在一个事务 提交不做任何操作。 当这个值为1(默认值)之时,在每个事务提交时,日志缓冲被写到日志文件,对日志文件做到磁盘操作的 刷 新。 当设置为2之时,在每个提交,日志缓冲被写到文件,但不对日志文件做到磁盘操作的刷新。尽管如此,在对 日志文件的刷新在值为2的情况也每秒发生一次。 我们必须注意到,因为进程安排问题,每秒一次的 刷新不是100%保证每秒都发生。你可以通过设置这个值不 为1来获得较好的性能,但随之你会在一次崩溃中损失二分之一价值的事务。如果你设置这个值为0,那么任何 mysqld mysqld进程的崩溃会删除崩溃前最后一秒的事务,如果你设置这个值为2,那么只有操作系统崩溃或掉电才会 删除最后一秒的事务。 尽管如此,InnoDB的崩溃恢复不受影响,而且因为这样崩溃恢复开始作用而不考虑这个值。注意,许多操作系 统和一些磁盘硬件会欺骗 刷新到磁盘操作。尽管刷新没有进行,你可以告诉mysqld mysqld mysqld刷新已经进行。即使设置 这个值为1,事务的持久程度不被保证,且在最坏情况下掉电甚至会破坏InnoDB数据库。在SCSI磁盘控制器中, 或在磁盘自身中,使用有后备电池的磁盘缓存会加速文件 刷新并且使得操作更安全。你也可以试着使用Unix 命令hdparm hdparm来在硬件缓存中禁止磁盘写缓存,或使用其它一些对硬件提供商专用的命令。这个选项的 默认值 hdparm 是1。 1. 多级cache。mysql -> 文件系统 ->raid