InnoDB引擎的索引和存储结构

在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。
而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。

1.MySQL主要存储引擎的区别

MySQL默认的存储引擎是MyISAM,其他常用的就是InnoDB,另外还有MERGE、MEMORY(HEAP)等。

(1)主要的几个存储引擎

MyISAM管理非事务表,提供高速存储和检索,以及全文搜索能力。
MyISAM是Mysql的默认存储引擎。当create创建新表时,未指定新表的存储引擎时,默认使用MyISAM。每个MyISAM在磁盘上存储成三个文件。文件名都和表名相同,扩展名分别是.frm(存储表定义)、.MYD (MYData,存储数据)、.MYI (MYIndex,存储索引)。数据文件和索引文件可以放置在不同的目录,平均分布io,获得更快的速度。 
InnoDB存储引擎用于事务处理应用程序,具有众多特性,包括ACID事务支持,提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

Memory将所有数据保存在内存中,可以应用于临时表中在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。Memory使用哈希索引,所以数据的存取速度非常快。
Merge允许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一起,并作为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。

(2)不同存储引擎的横向对比

 

 

特点 MyISAM BDB Memory InnoDB
存储限制 没有 没有 64TB
事务安全   支持   支持
锁机制 表锁 页锁 表锁 行锁
B树索引 支持 支持 支持 支持
哈希索引     支持 支持
全文索引 支持      
集群索引       支持
数据缓存     支持 支持
索引缓存 支持   支持 支持
数据可压缩 支持      
空间使用 N/A
内存使用 中等
批量插入的速度
支持外键       支持

(3)查看和配置存储引擎的操作
1.用show engines; 命令可以显示当前数据库支持的存储引擎情况;

2.要查看表的定义结构等信息可以使用以下几种命令:


1

2

3

Desc[ribe] tablename; //查看数据表的结构

Show create table tablename; //显示表的创建语句,可以查看创建表时指定的ENGINE

show table status like ‘tablename’\G显示表的当前状态值

3.设置或修改表的存储引擎
创建数据库表时设置存储存储引擎的基本语法是:


1

2

3

4

Create table tableName(

columnName(列名1) type(数据类型) attri(属性设置),

columnName(列名2) type(数据类型) attri(属性设置),

……..) engine = engineName

修改存储引擎,可以用命令


1

Alter table tableName engine =engineName

  

对于整个服务器或方案,你并不一定要使用相同的存储引擎,可以为方案中的每个表使用不同的存储引擎。

2.InnoDB的存储结构

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

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

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

1. 页头(Page Header):记录页面的控制信息,共占150字节,包括页的左右兄弟页面指针、页面空间使用情况等,页头的详细说明会在下一篇中描述。

2. 最小虚记录、最大虚记录:两个固定位置存储的虚记录,本身并不存储数据。最小虚记录比任何记录都小,而最大虚记录比任何记录都大。

3. 记录堆(record heap):指上图的橙黄色部分。表示页面已分配的记录空间,也是索引数据的真正存储区域。记录堆分为两种,即有效记录和已删除记录。有效记录就是索引正常使用的记录,而已删除记录表示索引已经删除,不在使用的记录,如上图的深蓝色部分。随着记录的更新和删除越来越频繁,记录堆中已删除记录将会越多,即会出现越来越多的空洞(碎片)。这些已删除记录连接起来,就会成为页面的自由空间链表。

4. 未分配空间:指页面未使用的存储空间,随着页面不断使用,未分配空间将会越来越小。当新插入一条记录时,首先尝试从自由空间链表中获得合适的存储位置(空间足够),如果没有满足的,就会在未分配空间中申请。

5. slot区:slot是一些页面有效记录的指针,每个slot占两个字节,存储了记录相对页面首地址的偏移。如果页面有n条有效记录,那么slot的数量就在n/8+2~n/4+2之间。下一节详细介绍slot区,它是记录页面有序和二分查找的关键。

6. 页尾(Page Tailer):页面最后部分,占8个字节,主要存储页面的校验信息。

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

3.InnoDB的索引结构

InnoDB使用B+Tree的方式存储索引。

Innodb的一个表可能包含多个索引,每个索引都使用B+树来存储。而索引包括聚集索引和二级索引,聚集索引使用表的主键作为索引键,包含表的所有字段。二级索引只包含索引键和聚集索引键(主键)的内容,不包括其他字段。每一个索引都是一棵B+树,每棵B+树由很多页面组成,而每个页面大小一般为16K。从B+树的组织结构来看,B树的页面可分为:
叶子节点:B树层次为0的页面,存储记录的所有内容
非叶子节点:B树层次大于0的页面,只存储索引键和页面指针。
一棵典型的B+树结构:


从上图可知,相同层次的页面是用一个双向链表连接起来的。
一般情况下,从B+树的最左边叶子节点开始,一直向右扫描,就可以得到B+树的从小到大的所有数据。因此,对于叶子节点,有如下特征:
页内数据是按索引键排序的。
页面的任一记录的索引键值不小于其左兄弟页面的任何记录。

 

时间: 2024-12-21 14:08:56

InnoDB引擎的索引和存储结构的相关文章

MySQL的InnoDB逻辑存储结构

InnoDB存储引擎中的表非常像Oracle中的索引组织表,每张表必须得有主键,如果表在创建时没有显示定 义主键,则根据以下原则自动创建主键: 1)如果有非空的唯一索引,则该索引所在的列为主键: 2)如果不符合上述条件,自动创建一个6个字节的指针为主键. InnoDB存储引擎的逻辑存储 结构和Oracle几乎一样,从大到小分别为:表空间.段.区.页,它们的关系如下图所示: 表空间 在上一篇<MySQL InnoDB文件介绍>中,我们知道InnoDB有一个默认的表空间,如果我们启用了参数 inn

MySQL存储结构MyISAM和InnoDB

MySQL两种表存储结构MyISAM和InnoDB的性能比较测试 MyISAM 表.MyISAM 存储格式自版本 3.23 以来是 MySQL 中的缺省类型,它有下列特点: ■ 如果操作系统自身允许更大的文件,那么文件比 ISAM 存储方法的大. ■ 数据以低字节优先的机器独立格式存储.这表示可将表从一种机器拷贝到另一种机器,即使它们的体系结构不同也可以拷贝. ■ 数值索引值占的存储空间较少,因为它们是按高字节优先存储的.索引值在低位字节中变化很快,因此高位字节更容易比较. ■ AUTO_INC

一些存储引擎存储结构简介

概述 本文简要介绍了一些存储引擎存储结构,包括InnoDB, TokuDB, RocksDB, TiDB, CockroachDB, 供大家对比分析 InnoDB InnoDB 底层存储结构为B+树,结构如下 B树的每个节点对应innodb的一个page,page大小是固定的,一般设为16k. 其中非叶子节点只有键值,叶子节点包含完成数据. InnoDB按segment, extent, page方式管理page 每个数据节点page结构如下 数据记录record按行存储,record具体格式由

树 链表 索引 检索-树形的存储结构和双向有序链表的存储结构有什么不同呢?各有什么优势呢?

问题描述 树形的存储结构和双向有序链表的存储结构有什么不同呢?各有什么优势呢? 在做数据检索技术研究的时候,经常会遇到是用树形结构存储索引还是使用线性结构存储.不知道二者有什么不同,各有什么优势以及各自的适用场合.敬请各位赐教,谢谢. 解决方案 这个问题很复杂,一句两句也说不清楚,你可以去相关大学查阅相关资料,询问相关人员进行解答

MySQL · 源码分析 · Innodb 引擎Redo日志存储格式简介

MySQL有多种日志.不同种类.不同目的的日志会记录在不同的日志文件中,它们可以帮助你找出mysqld内部发生的事情.比如错误日志:用来记录启动.运行或停止mysqld进程时出现的问题:查询日志:记录建立的客户端连接和执行的语句:二进制日志:记录所有更改数据的语句,主要用于逻辑复制:慢日志:记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询.而对MySQL中最常用的事务引擎innodb,redo日志是保证事务一致性非常重要的.本文结合MySQL版本5.6为分析源码介

MySQL的InnoDB引擎入门学习教程_Mysql

MySQL发展到今天,InnoDB引擎已经作为绝对的主力,除了像大数据量分析等比较特殊领域需求外,它适用于众多场景.然而,仍有不少开发者还在"执迷不悟"的使用MyISAM引擎,觉得对InnoDB无法把握好,还是MyISAM简单省事,还能支持快速COUNT(*).本文是由于最近几天帮忙处理discuz论坛有感而发,希望能对广大开发者有帮助. 1. 快速认识InnoDBInnoDB是MySQL下使用最广泛的引擎,它是基于MySQL的高可扩展性和高性能存储引擎,从5.5版本开始,它已经成为了

提高MySQL中InnoDB表BLOB列的存储效率的教程_Mysql

首先,介绍下关于InnoDB引擎存储格式的几个要点: 1.InnoDB可以选择使用共享表空间或者是独立表空间方式,建议使用独立表空间,便于管理.维护.启用 innodb_file_per_table 选项,5.5以后可以在线动态修改生效,并且执行 ALTER TABLE xx ENGINE = InnoDB 将现有表转成独立表空间,早于5.5的版本,修改完这个选项后,需要重启才能生效: 2.InnoDB的data page默认16KB,5.6版本以后,新增选项 innodb_page_size

MySQL从MyISAM引擎转换到InnoDB引擎需要注意的地方

  分析 当了解完两种引擎的不同之处,很轻松的就能知道有哪些关键点了. 总的来说,从MyISAM转向InnoDB的注意事项有: 1.MyISAM的主键索引中,可以在非第一列(非第一个字段)使用自增列,而InnoDB的主键索引中包含自增列时,必须在最前面;这个特性在discuz论坛中,被设计用于"抢楼"功能,因此,若有类似的业务,则无法将该表从MyISAM转成InnoDB,需要自行变通实现(我们则是将其改到Redis中实现); 2.不带条件频繁统计全表总记录数时(SELECT COUNT

详解MySQL下InnoDB引擎中的Memcached插件_Mysql

前些年,HandlerSocket的横空出世让人们眼前一亮,当时我还写了一篇文章介绍了其用法梗概,时至今日,由于种种原因,HandlerSocket并没有真正流行起来,不过庆幸的是MySQL官方受其启发,研发了基于InnoDB的Memcached插件,总算是在MySQL中延续了NoSQL的香火,以前单独架设Memcached服务器不仅浪费了内存,而且还必须自己维护数据的不一致问题,有了Memcached插件,这些问题都不存在了,而且借助MySQL本身的复制功能,我们可以说是变相的实现了Memca