首页 » SEO优化 » phpinnodbmyisam技巧_一文看懂mysql数据库本质及存储引擎innodbmyisam

phpinnodbmyisam技巧_一文看懂mysql数据库本质及存储引擎innodbmyisam

访客 2024-12-10 0

扫一扫用手机浏览

文章目录 [+]

文件夹-文件:一个数据库实在便是一个的文件夹,数据库里面的表便是文件夹里的一个或者多个文件(根据数据库引擎不同而不同,MyISAM是3个,InnoDB是2.5个)

mysql的数据库实在便是存放在MySQL\data下的一个个的文件夹

phpinnodbmyisam技巧_一文看懂mysql数据库本质及存储引擎innodbmyisam

数据库里面的表便是文件夹里的一个或者多个文件(根据数据库引擎不同而不同)

phpinnodbmyisam技巧_一文看懂mysql数据库本质及存储引擎innodbmyisam
(图片来自网络侵删)
一、为什么要合理选择数据库存储引擎?

在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。
而MySql数据库供应了多种存储引擎。

MySQL中的数据用各种不同的技能存储在文件(或者内存)中。
这些技能中的每一种技能都利用不同的存储机制、索引技巧、锁定水平并且终极供应广泛的不同的功能和能力。
通过选择不同的技能,你能够得到额外的速率或者功能,从而改进你的运用的整体功能。

这些不同的技能以及配套的干系功能在MySQL中被称作存储引擎(也称作表类型)。
MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL做事器中启用。
你可以选择适用于做事器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你须要你的数据结合什么性能和功能的时候为你供应最大的灵巧性。

二、myisam表引擎存储

1、myisam的存储构造

每一个表都有3个文件,都位于数据库目录中.

tb_name.frm 表构造定义tb_name.MYD 表数据tb_name.MYI 表索引

2、myisam索引构造

MyISAM引擎利用B+Tree作为索引构造,叶节点的data域存放的是数据记录的地址。
下图是MyISAM索引的事理图:

这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引(Primary key)示意。
可以看出MyISAM的索引文件仅仅保存数据记录的地址。
在MyISAM中,主索引和赞助索引(Secondary key)在构造上没有任何差异,只是主索引哀求key是唯一的,而赞助索引的key可以重复。
如果我们在Col2上建立一个赞助索引,则此索引的构造如下图所示:

同样也是一颗B+Tree,data域保存数据记录的地址。
因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。

MyISAM的索引办法也叫做“非聚拢”的,之以是这么称呼是为了与InnoDB的聚拢索引区分。

三、innodb表引擎存储(有数据的共享区域,myisam没有)

1、InnoDB的存储构造

InnoDB利用页面存储构造,下面是InnoDB的表空间构造图:

Innodb表:有2种存储办法:

1 默认,每一个表有一个独立的表构造定义文件 和 一个多表数据+索引共享文件

tb_name.frm 表构造 位于指天命据库中

ibdata# 共享表空间 位于数据库目录中datadir

2 利用独立的表空间 每一个表有一个独立的表构造文件和一个独立的表空间文件

tb_name.frm 表构造 位于指天命据库中

tb_name.ibd 表数据 和 索引文件

Page页面存储格式如下图所示:

一个页面的存储由以下几部分组成:

页头(Page Header):记录页面的掌握信息,共占150字节,包括页的旁边兄弟页面指针、页面空间利用情形等,页头的详细解释会不才一篇中描述。
最小虚记录、最大虚记录:两个固定位置存储的虚记录,本身并不存储数据。
最小虚记录比任何记录都小,而最大虚记录比任何记录都大。
记录堆(record heap):指上图的橙黄色部分。
表示页面已分配的记录空间,也是索引数据的真正存储区域。
记录堆分为两种,即有效记录和已删除记录。
有效记录便是索引正常利用的记录,而已删除记录表示索引已经删除,不在利用的记录,如上图的深蓝色部分。
随着记录的更新和删除越来越频繁,记录堆中已删除记录将会越多,即会涌现越来越多的空洞(碎片)。
这些已删除记录连接起来,就会成为页面的自由空间链表。
未分配空间:指页面未利用的存储空间,随着页面不断利用,未分配空间将会越来越小。
当新插入一条记录时,首先考试测验从自由空间链表中得到得当的存储位置(空间足够),如果没有知足的,就会在未分配空间中申请。
slot区:slot是一些页面有效记录的指针,每个slot占两个字节,存储了记录相对页面首地址的偏移。
如果页面有n条有效记录,那么slot的数量就在n/8+2~n/4+2之间。
下一节详细先容slot区,它是记录页面有序和二分查找的关键。
页尾(Page Tailer):页面末了部分,占8个字节,紧张存储页面的校验信息。

页面中的页头,最大/最小虚记录以及页尾都是页面中有固定的存储位置。

2、InnoDB的索引构造

InnoDB利用B+Tree的办法存储索引。

Innodb的一个表可能包含多个索引,每个索引都利用B+树来存储。
而索引包括聚拢索引和二级索引,聚拢索引利用表的主键作为索引键,包含表的所有字段。
二级索引只包含索引键和聚拢索引键(主键)的内容,不包括其他字段。
每一个索引都是一棵B+树,每棵B+树由很多页面组成,而每个页面大小一样平常为16K。
从B+树的组织构造来看,B树的页面可分为:

叶子节点:B树层次为0的页面,存储记录的所有内容。

非叶子节点:B树层次大于0的页面,只存储索引键和页面指针。

虽然InnoDB也利用B+Tree作为索引构造,但详细实现办法却与MyISAM截然不同。

第一个重大差异是InnoDB的数据文件本身便是索引文件。
从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。
而在InnoDB中,表数据文件本身便是按B+Tree组织的一个索引构造,这棵树的叶节点data域保存了完全的数据记录。
这个索引的key是数据表的主键,因此InnoDB表数据文件本身便是主索引。

可以看到叶节点包含了完全的数据记录。
这种索引叫做聚拢索引。
由于InnoDB的数据文件本身要按主键聚拢,以是InnoDB哀求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表天生一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

第二个与MyISAM索引的不同是InnoDB的赞助索引data域存储相应记录主键的值而不是地址。
换句话说,InnoDB的所有赞助索引都引用主键作为data域。
例如,下图为定义在Col3上的一个赞助索引:

这里以英笔墨符的ASCII码作为比较准则。
聚拢索引这种实现办法使得按主键的搜索十分高效,但是赞助索引搜索须要检索两遍索引:首先检索赞助索引得到主键,然后用主键到主索引中检索得到记录。

理解不同存储引擎的索引实现办法对付精确利用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很随意马虎明白为什么不建议利用过长的字段作为主键,由于所有赞助索引都引用主索引,过长的主索引会令赞助索引变得过大。
再例如,用非单调的字段作为主键在InnoDB中不是个好主张,由于InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了坚持B+Tree的特性而频繁的分裂调度,十分低效,而利用自增字段作为主键则是一个很好的选择。

以为有用的朋友多帮忙转发哦!
后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

标签:

相关文章

公式运算php技巧_高并发我把握不住啊

什么是高并发高并发指的是系统同时处理很多要求。高并发是一个结果导向的东西,例如,常见的高并发场景有:淘宝的双11、春运时的抢票、微...

SEO优化 2024-12-14 阅读0 评论0