摘要
今天主要讲一下mysql数据库引擎的一些概念和mysql数据库的本质,用一句话概括:
文件夹-文件:数据库实际上是一个新文件夹,数据库中的表是文件夹中的一个或多个文件(取决于数据库引擎,MyISAM是3,InnoDB是2.5)
Mysql的数据库实际上是存储在MySQLdata下的一个文件夹。
数据库中的表是文件夹中的一个或多个文件(取决于数据库引擎)。
一、为什么要合理选择数据库存储引擎?
Oracle、SQL Server等数据库只有一个存储引擎,所有的数据存储管理机制都是一样的。MySql数据库提供了多种存储引擎。
MySQL中的数据通过各种技术存储在文件(或内存)中。这些技术中的每一种都使用不同的存储机制、索引技术、锁定级别,并最终提供各种不同的功能和能力。通过选择不同的技术,您可以获得额外的速度或功能,从而提高应用程序的整体功能。
这些不同的技术和相关的功能在MySQL中被称为存储引擎(也称为表类型)。MySQL默认配置了很多不同的存储引擎,可以提前设置,也可以在MySQL服务器中启用。您可以选择适用于服务器、数据库和表的存储引擎,以便在选择如何存储信息、如何检索信息以及您需要数据结合哪些性能和功能时,为您提供最大的灵活性。
第二,myisam表引擎存储
1。myisam的存储结构
每个表有三个文件,它们都位于数据库目录中。
tb_name.frm 表结构定义tb_name.MYD 表数据tb_name.MYI 表索引
2,myisam索引结构
MyISAM引擎使用B+树作为索引结构,叶子节点的数据域存储数据记录的地址。下图是MyISAM索引的示意图:
让我们假设这个表中有三列。假设我们把Col1作为主键,上图就是MyISAM表的一个主键。可以看出,MyISAM的索引文件只存储数据记录的地址。在MyISAM中,主索引和辅键在结构上没有区别,只是主索引要求键是唯一的,而辅索引键可以重复。如果我们在Col2上建立一个二级索引,这个索引的结构如下图所示:
它也是B+树,即data do***in中存储数据记录的地址。因此,MyISAM中的索引检索算法首先是根据B+树搜索算法来搜索索引。如果指定的键存在,则取出其数据字段的值,然后以数据字段的值作为地址读取相应的数据记录。
MyISAM的索引方法也被称为“非聚集的”,因此调用它是为了与InnoDB的聚集索引相区别。
三。innodb表引擎存储(有一个共享的数据区域,但myisam没有)
1。InnoDB的存储结构
InnoDB使用页面存储结构。下面是InnoDB的表空之间的结构图:
Innodb表:有两种存储方式:
1默认情况下,每个表都有一个独立的表结构定义文件和一个多表数据+索引共享文件。
Tb_name.frm表结构在指定的数据库中。
Ib #共享表空是数据库目录中的datadir。
2使用独立的表空。每个表都有一个独立的表结构文件和一个独立的table 空文件。
Tb_name.frm表结构在指定的数据库中。
Tb_name.ibd表数据和索引文件
页面存储格式如下图所示:
页面的存储由以下部分组成:
页头(Page Header):记录页面的控制信息,共占150字节,包括页的左右兄弟页面指针、页面空间使用情况等,页头的详细说明会在下一篇中描述。最小虚记录、最大虚记录:两个固定位置存储的虚记录,本身并不存储数据。最小虚记录比任何记录都小,而最大虚记录比任何记录都大。记录堆(record heap):指上图的橙***部分。表示页面已分配的记录空间,也是索引数据的真正存储区域。记录堆分为两种,即有效记录和已删除记录。有效记录就是索引正常使用的记录,而已删除记录表示索引已经删除,不在使用的记录,如上图的深蓝色部分。随着记录的更新和删除越来越频繁,记录堆中已删除记录将会越多,即会出现越来越多的空洞(碎片)。这些已删除记录连接起来,就会成为页面的自由空间链表。未分配空间:指页面未使用的存储空间,随着页面不断使用,未分配空间将会越来越小。当新插入一条记录时,首先尝试从自由空间链表中获得合适的存储位置(空间足够),如果没有满足的,就会在未分配空间中申请。slot区:slot是一些页面有效记录的指针,每个slot占两个字节,存储了记录相对页面首地址的偏移。如果页面有n条有效记录,那么slot的数量就在n/8+2~n/4+2之间。下一节详细介绍slot区,它是记录页面有序和二分查找的关键。页尾(Page Tailer):页面最后部分,占8个字节,主要存储页面的校验信息。
一页的页眉、最大/最小虚拟记录和页脚在该页中有一个固定的存储位置。
2。InnoDB的索引结构
InnoDB使用B+树来存储索引。
Innodb的一个表可能包含多个索引,每个索引由B+树存储。索引包括聚集索引和辅助索引。聚集索引使用表的主键作为索引键,并且包含表的所有字段。二级索引只包含索引键和聚集索引键(主键)的内容,不包含其他字段。每个索引都是B+树。每个B+树由许多页面组成,每个页面的大小一般为16K。从B+树的组织结构来看,B树的页面可以分为:
leaf:B树级别为0的页面,存储所有记录的内容。
非叶节点:B树层次大于0的页面,只存储索引键和页面指针。
虽然InnoDB也使用B+Tree作为索引结构,但具体实现与MyISAM有很大不同。
第一个重要的区别是InnoDB的数据文件本身是一个索引文件。从上面我们知道,MyISAM索引文件和数据文件是分开的,索引文件只存储数据记录的地址。在InnoDB中,表数据文件本身就是一个按照B+树组织的索引结构,这个树的叶节点数据字段保存了完整的数据记录。这个索引的键是数据表的主键,所以InnoDB表数据文件本身就是主索引。
您可以看到叶节点包含完整的数据记录。这种索引称为聚集索引。因为InnoDB的数据文件是通过主键聚合的,所以InnoDB要求表必须有主键(MyISAM可能没有主键)。如果没有明确指定,MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键。如果没有这样的列,MySQL将自动为InnoDB表生成一个隐含字段作为主键。该字段为6字节长,其类型为长整形。
与MyISAM索引的第二个区别是,InnoDB的二级索引的数据字段存储的是对应记录主键的值,而不是地址。换句话说,InnoDB的所有二级索引都将主键称为数据域。例如,下图显示了在Col3上定义的辅助索引:
这里,英文字符的ASCII码被用作比较标准。索引聚合的实现使得按主键搜索的效率非常高,但是二级索引搜索需要两次检索索引:首先检索二级索引获得主键,然后使用主键检索一级索引中的记录。
了解不同存储引擎的索引实现,对正确使用和优化索引非常有帮助。比如了解了InnoDB的索引实现,就很容易理解为什么不建议使用过长的字段作为主键,因为所有的二级索引都是引用一级索引,过长的一级索引会使二级索引过大。例如,在InnoDB中使用非单调字段作为主键并不是一个好主意,因为InnoDB数据文件本身就是一个B+树。在插入新记录时,非单调主键会为了维护B+树的特性而造成数据文件的频繁拆分和调整,效率非常低,而使用自增字段作为主键是一个不错的选择。
本文来自年轻人玩的就是心跳投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/629398.html