体育老师都能看懂的InnoDB存储引擎原理

老规矩,我们还是从一些看似不着边际的基础知识开始说起吧。。。。

操作系统的一些概念

我们常说的磁盘结构图如下:绿色弧道的就是扇区,灰色的就是磁道

磁盘中每个盘面结构
磁盘的整体结构

扇区是磁盘的最小组成单元,是磁盘的读写单位,大小我们就机械的认为是512字节。
柱面 就是第一张图中的磁道
磁盘存储容量 = 磁头数磁道(柱面)数每道扇区数每扇区字节数
可能有人会发现,每个扇区存储大小一样,那岂不是越靠近圆心的扇区越密集??对于老式磁盘确实是!新式磁盘有所改进,但是我们不打算深究~~~~
磁盘块(blocks)是操作系统层面的虚拟概念,是操作系统与磁盘打交道的最小单位,一般是4KB(一般是扇区大小
2^n)
是操作系统与内存打交道的最小单位

InnoDB中的一些概念

为了显的高大上,我们也俗套的甩几个专业名次上来吧😢
Buffer Pool数据库缓冲池
Redo Log 重做日志,先理解成草稿吧
Datafile 数据文件,先理解成正稿及最终稿吧
Checkpoint,LSN
上面说的这几个概念都是为了在提升性能的同时,又能保证数据不丢失,那么是怎么做到的呢?请看下面一个对比的例子,大家就会明白

互联网圈,为了骗取投资人的钱,在进行融资前都会编一些ppt啥的,老板让你给他编一个可以忽悠人的ppt,你突然想到一个绝美的idea,但是你白天都在划水,又不想干活,只想晚上加班搞,但你又担心 暂时记在脑子里的这个idea到晚上会忘记,你就会先围绕这个idea大概思考一个大纲,匆忙记到一个草稿上,然后立马跑到老板面前告诉他,你要编什么东东,让他确认,到晚上了,根据草稿的内容去斟词酌句,编写正文。正文就是我们最终要拿去骗钱的ppt。
这里我们的大脑就相当于Buffer Pool,我们的大脑就像内存一样记得快,忘的也快,就像内存数据易丢失一样
重做日志Redolog,就好比我们的草稿
Datafile就是我们的正稿
按照我们编ppt的方式,来进行数据库事务的写入操作,不仅能保证数据不丢失(大脑忘记了还有草稿),还能够快速响应,得到客户端的确认(我们快速给老板响应告诉他写什么,得到他的确认)

数据库为了保证这个 【草稿】一定能恢复成正稿,还不能占用太多空间,就要求这个redo log(草稿)必须具有几个特点
Redo log一定要保存了所有要写入的内容
Redolog 只会在文件末尾增加数据,而不会去改变旧的数据
一旦事务数据被写入datafile,redo log中的草稿就可以删除了
正文在形成之前,草稿是不会删除的;也就是说只要草稿在我们一定能写出正文,就算数据库Crash了,只要又redolog我们也不怕。

我们知道,数据库在使用过程中事务是源源不断的,也是很快的,而且根据草稿写出正稿是一个很费时间的时,所以往往草稿的产生速度是远远大于正稿的产生速度的,也就是说你加班一个晚上根本写不完,要连续写好多次才有可能写完。 这样就会面临一个问题,昨天我编到哪里了?当然你也可以一个个去对,但是这样效率也太低了吧。 你或许会把最后一条生成正稿的草稿 打上一个标记,这样第二天可以直接从这个标记的地方开始写,而不关心前面的内容,也可以把前面的草稿内容删除掉。

这里最近一条变成正稿的草稿记录就是Checkpoint,LSN就是每条草稿的编号。

数据库配置文件汇总

木有办法,为了讲解innodb的某些东西,我不得不先拐个弯,把mysql配置吃透~~~
首先我们通过如下命令获取到mysql服务的安装目录

安装目录
可以看到我的安装目录是/usr 或者连上sql时 执行select @@basedir命令。

使用ps aux|grep mysql|grep 'my.cnf' 查看mysql启动的配置文件,如果没有,说明使用的默认配置,使用下面的命令

mysql --help|grep 'my.cnf' 启动时会使用第一个目录的文件
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf

启动服务 mysqld start 重启服务mysqld restart 停止服务 mysqld stop

现在我们知道了如何查找配置文件,已经如何启动服务(其它更详细的命令后续用到了再说),终于开始正儿八经研究配置文件了

  • 数据库配置文件汇总
// 这个是官方的默认文件,我们按照自己的学习记录一步一步去填充吧。在后续的概念讲解中,我们会不时的翻到这个配置文件中来做说明

/*对mysql服务器的优化参数主要集中在mysqld段中国,其它段的参数对mysql性能的影响微乎其微*/
[mysqld]
# 开启innodb引擎的独立表空间MySQL5.6.7之后默认开启
innodb_file_per_table = 1

# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M

# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin

# These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
# socket = .....

# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

  • 表空间:即存放数据库表数据的地方
    表空间的具体数据结构我们后续讲,先搞明白这个表空间是干什么用的,在看原理。
    Innodb有两种管理表空间的方法:
    1. 共享表空间(这个我们暂时不研究)
    2. 独立表空间每一个表有一个独立的表空间(现在都用这个,随着我们讲解的进行,好处自然而然会出来)
    如果想要使用独立表空间,my.conf中配置innodb_file_per_table【请参照配置文件】
    使用命令 show VARIABLES like 'innodb_file_per_table'; 查看独立表空间是否开启
    开启该功能后,每创建一个新表就会在数据存放目录中的相应库目录下面(我的是/var/lib/mysql,这个目录可以通过上文截图中的--datadir=/var/lib/mysql找到)增加一个ibd文件,ibd文件就是该数据表的数据文件了。
    这个目录下,每个表都会对应一个.frm 文件和一个 .ibd文件,其中.frm是表结构文件,.ibd 是数据文件。其中.frm文件是每个存储引擎都会有的一个文件。
    .ibd文件
    innodeb引擎,使用IOT(索引组织表,即表中的数据都是根据主键顺序组织存放)的形式来管理表数据,表的索引跟数据都保存在.ibd文件中
    既然说到了索引,我们又要先跑一下题,看一下InnoDB引擎的索引,innodb使用是B+树索引。先从B+树结构说起吧
    B数结构
    B树的一个大概查找思路如下:

每个节点中都是有序码表,假如我们要查找9,首先在第一层查找,因为1<9<35 所以定位到第二层的2-10之间,然后定位到第三层,在有序码表中>8最终找到叶子节点上(B数中叶子节点不保存数据),如果找到了叶子节点上,说明该数据不存在。同理找37就可以找到。

innodb表的索引跟数据文件是同一个.idb文件,innodb使用B+Tree,与上图的区别是,叶子节点非空,页节点的data域保存了完整的数据记录,码值域就是数据表的主键。这种索引与数据文件在一块的就是聚集索引。innodb表的辅助索引也是先找到对应的主索引,然后再根据主索引找到数据data这是因为innodb表的数据是按照主键聚集的,这也同时要求innodb表必须有主键
单独表空间优点和缺点
优点
每个表都有自已独立的表空间。
每个表的数据和索引都会存在自已的表空间中。
可以实现单表在不同的数据库中移动。
空间可以回收
缺点
1单表增加过大,响应也是较慢,可以使用分区表
2单表增加过大,当单表占用空间过大时,存储空间不足,只能从操作系统层面思考解决方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,039评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,426评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,417评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,868评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,892评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,692评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,416评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,326评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,782评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,957评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,102评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,790评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,442评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,996评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,113评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,332评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,044评论 2 355

推荐阅读更多精彩内容