mysql常用的三种引擎
(1) MyISAM存储引擎
不支持事务、也不支持外键,支持全文索引优势是访问速度快,对事务完整性没有 要求或者以select,insert为主的应用基本上可以用这个引擎来创建表支持3种不同的存储格式,分别是:静态表;动态表;压缩表
静态表:表中的字段都是非变长字段,这样每个记录都是固定长度的,优点存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多(因为存储时会按照列的宽度定义补足空格)ps:在取数据的时候,默认会把字段后面的空格去掉,如果不注意会把数据本身带的空格也会忽略。
动态表:记录不是固定长度的,这样存储的优点是占用的空间相对较少;缺点:频繁的更新、删除数据容易产生碎片,需要定期执行OPTIMIZE TABLE或者myisamchk-r命令来改善性能
压缩表:因为每个记录是被单独压缩的,所以只有非常小的访问开支
MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的
物理文件结构
每一个表在MyISAM存储引擎中都以三个以表名命名的物理文件构成。
(1)任何存储引擎都不可或缺的存放表结构定义的.frm(Form)文件
(2)存放表数据的.MYD文件(My Data)
(3)存放索引数据的.MYI文件(My Index)
这里着重说一下.MYD文件的文件存放格式,分为静态固定长度、动态可变长度、压缩三种格式。表数据是默认不压缩的,在创建表时,可以通过ROW_FORMAT设置默认为压缩{COMPRESSED|DEFAULT},也可以通过MyISAMpack工具进行压缩。
当表数据没有被压缩时,静态与动态的区分就与表中定义的字段类型有关了。当出现VARCHAR等可变长度类型时,这个表就是动态的;当没有出现任何可变长类型时,这个表就是静态的。
(2) InnoDB存储引擎*
该存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM引擎,写的处理效率会差一些,并且会占用更多的磁盘空间以保留数据和索引.不支持全文索引.支持自动增长列,支持外键约束.在InnoDB存储引擎表中,每张表都有个主键,
InnoDB特性:
1.InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败
2.InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务.
3.InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大.
4.InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快.如果语句后面加上where条件,那么两个引擎就没什么区别了.
5.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
6.InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表
7.如果在创建表时没有显式地定义主键(Primary Key),则InnoDB存储引擎会按如下方式选择或创建主键。首先表中是否有非空的唯一索引(Unique NOT NULL),如果有,则该列即为主键。不符合上述条件,InnoDB存储引擎自动创建一个6个字节大小的指针。
物理文件结构
.frm与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等。
索引和数据文件保存在.ibd文件和.ibdata文件:
这两种文件都是存放innodb数据的文件,之所以用两种文件来存放innodb的数据,是因为innodb的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是用独享表空间存放存储数据。
独享表空间存储方式使用.ibd文件,并且每个表一个ibd文件,共享表空间存储方式使用.ibdata文件,所有表共同使用一个ibdata文,觉得使用哪种方式的参数在mysql的配置文件中 innodb_file_per_table
如果是共享表空间,通过innodb_data_file_path指定后,每次增加数据文件后必须停机重启才能生效,很不方便.
逻辑存储结构
InnoDB存储引擎的逻辑存储结构和Oracle大致相同,所有数据都被逻辑地存放在一个空间中,我们称之为表空间(tablespace)。表空间又由段(segment)、区(extent)、页(page)组成。页在一些文档中有时也称为块(block),1 extent = 64 pages,InnoDB存储引擎的逻辑存储结构大致如图所示。
表空间
表空间可以看做是InnoDB存储引擎逻辑结构的最高层,所有的数据都是存放在表空间中。默认情况下InnoDB存储引擎有一个共享表空间ibdata1,即所有数据都放在这个表空间内。如果我们启用了参数innodb_file_per_table,则每张表内的数据可以单独放到一个表空间. 对于启用了innodb_file_per_table的参数选项,需要注意的是,每张表的表空间内存放的只是数据、索引和插入缓冲,其他类的数据,如撤销(Undo)信息、系统事务信息、二次写缓冲(double write buffer)等还是存放在原来的共享表空间内。这也就说明了另一个问题:即使在启用了参数innodb_file_per_table之后,共享表空间还是会不断地增加其大小。
现在我们来做个实验,实验之前我已经将innodb_file_per_table设为ON了,看看初始共享表空间文件有多大:
show variables like 'innodb_file_per_table' \G
system ls -lh /usr/local/var/mysql/ibdata1
共享表空间ibdata1的大小为76M。
set autocommit=0;
update mytest set salary=0;
system ls -lh /usr/local/var/mysql/ibdata1
首先将自动提交设为0,即我们需要显式提交事务(注意,上面结束时我们并没有commit或者rollback该事务)。接着我们执行会产生大量Undo操作的语句update mytest set salary=0,完成后我们再观察共享表空间,会发现ibdata1已经增长到了114MB,这就说明了共享表空间中还包含有Undo信息。如果我rollback这个事务,ibdata1这个表空间会不会缩减至原来的58MB大小?我们接下去就来验证:
rollback;
system ls -lh /usr/local/var/mysql/ibdata1
很“可惜”,还是114MB,即InnoDB存储引擎不会在rollback时去收缩这个表空间。虽然InnoDB不会帮你回收这些空间,但是MySQL会自动判断这些Undo信息是否需要,如果不需要,则会将这些空间标记为可用空间,供下次Undo使用。master thread每10秒会执行一次full purge操作。因此很有可能的一种情况是,你再次执行上述的UPDATE语句后,会发现ibdata1不会再增大了,那就是这个原因了。
段
上图中显示了表空间是由各个段组成的,常见的段有数据段、索引段、回滚段等。InnoDB存储引擎表是索引组织的(index organized),因此数据即索引,索引即数据。那么数据段即为B+树的页节点(上图的leaf node segment),索引段即为B+树的非索引节点(上图的non-leaf node segment)。
与Oracle不同的是,InnoDB存储引擎对于段的管理是由引擎本身完成,这和Oracle的自动段空间管理(ASSM)类似,没有手动段空间管理(MSSM)的方式,这从一定程度上简化了DBA的管理。
需要注意的是,并不是每个对象都有段。因此更准确地说,表空间是由分散的页和段组成。
区
区是由64个连续的页组成的,每个页大小为16KB,即每个区的大小为1MB。对于大的数据段,InnoDB存储引擎最多每次可以申请4个区,以此来保证数据的顺序性能。
在我们启用了参数innodb_file_per_talbe后,创建的表默认大小是96KB。区是64个连续的页,那创建的表的大小至少是1MB才对啊?其实这是因为在每个段开始时,先有32个页大小的碎片页(fragment page)来存放数据,当这些页使用完之后才是64个连续页的申请。
通过一个实验来显示InnoDB存储引擎对于区的申请:
create table t1 (
col1 int not null auto_increment,
col2 varchar (7000),
primary key(col1)
)engine=InnoDB;
system ls -lh /usr/local/var/mysql/test/t1.ibd
创建了t1表,col2字段设为varchar(7000),这样能保证一个页中可以存放2条记录。可以看到,初始创建完t1后表空间默认大小为96KB.
页
同大多数数据库一样,InnoDB有页(page)的概念(也可以称为块),页是InnoDB磁盘管理的最小单位。与Oracle类似的是,Microsoft SQL Server数据库默认每页大小为8KB,不同于InnoDB页的大小(16KB),且不可以更改(也许通过更改源码可以)。
常见的页类型有:
- 数据页(B-tree Node)。
- Undo页(Undo Log Page)。
- 系统页(System Page)。
- 事务数据页(Transaction system Page)。
- 插入缓冲位图页(Insert Buffer Bitmap)。
- 插入缓冲空闲列表页(Insert Buffer Free List)。
- 未压缩的二进制大对象页(Uncompressed BLOB Page)。
- 压缩的二进制大对象页(Compressed BLOB Page)。
行
InnoDB存储引擎是面向行的(row-oriented),也就是说数据的存放按行进行存放。每个页存放的行记录也是有硬性定义的,最多允许存放16KB/2~200行的记录,即7992行记录。这里提到面向行(row-oriented)的数据库,那么也就是说,还存在有面向列(column-orientied)的数据库.
(3) MEMORY存储引擎
Memory存储引擎使用存在于内存中的内容来创建表。每个memory表只实际对应一个磁盘文件,格式是.frm。memory类型的表访问非常的快,因为它的数据是放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失掉。
MEMORY存储引擎的表可以选择使用BTREE索引或者HASH索引,两种不同类型的索引有其不同的使用范围
Hash索引优点:
Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。
Hash索引缺点: 那么不精确查找呢,也很明显,因为hash算法是基于等值计算的,所以对于“like”等范围查找hash索引无效,不支持;
Memory类型的存储引擎主要用于哪些内容变化不频繁的代码表,或者作为统计操作的中间结果表,便于高效地对中间结果进行分析并得到最终的统计结果.
(4)不同存储引擎的横向对比
存储限制 | 没有 | 没有 | 有 | 64TB |
事务安全 | 支持 | 支持 | ||
锁机制 | 表锁 | 页锁 | 表锁 | 行锁 |
B树索引 | 支持 | 支持 | 支持 | 支持 |
哈希索引 | 支持 | 支持 | ||
全文索引 | 支持 | |||
集群索引 | 支持 | |||
数据缓存 | 支持 | 支持 | ||
索引缓存 | 支持 | 支持 | 支持 | |
数据可压缩 | 支持 | |||
空间使用 | 低 | 低 | N/A | 高 |
内存使用 | 低 | 低 | 中等 | 高 |
批量插入的速度 | 高 | 高 | 高 | 低 |
支持外键 | 支持 |
相关推荐
这些存储引擎,例如MyISAM、InnoDB、BDB、MEMORY等,各有其特定的特性与适用场景,从而使得MySQL成为一个在多种场景下都能表现优秀的数据库系统。 首先,MySQL的存储引擎是插件式的,意味着可以根据不同的应用需求...
它是MySQL早期版本中最常用的存储引擎之一,尤其适用于读取密集型的应用环境。 **2.2 特性与优势** - **大文件支持**:支持大文件(64位文件长度),在支持大文件的文件系统和操作系统上可以实现高效的存储。 - **...
MyISAM是早期常用的引擎,它支持表级锁定,这意味着在执行更新或插入操作时,整个表会被锁定,导致其他读写操作必须等待。因此,MyISAM不适用于高并发的读写场景。此外,MyISAM不支持事务处理,不提供事务回滚功能,...
其中,InnoDB作为MySQL中最常用的存储引擎之一,提供了众多高级特性,如事务支持、行级锁定以及外键约束等。本文将详细介绍如何在MySQL中启用InnoDB存储引擎,并对比分析InnoDB与其他存储引擎(如MyISAM)之间的主要...
1. **InnoDB** 引擎是MySQL中最常用的引擎之一,尤其在需要事务处理和外键约束的场合。InnoDB支持ACID(原子性、一致性、隔离性、持久性)事务,提供行级锁定,以降低并发操作时的锁定冲突。此外,InnoDB使用B+树...
### MySQL InnoDB 存储引擎特性详解 #### InnoDB 存储引擎概述 InnoDB 存储引擎作为 MySQL 数据库中最常用的存储引擎之一,自 1995 年由 Heikki Tuuri 创建以来,经历了从一个独立项目到被 Oracle 公司收购,并...
### MySQL Innodb 引擎特性详解 #### 一、MySQL Innodb 引擎概述 MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它提供了多种存储引擎以满足不同场景的需求。其中,InnoDB是最常用的一种存储引擎之一,...
动力节点的杜老师讲述的mysql教程,详细讲解了MySQL的相关知识,包括MySQL概述,MySQL应用环境,MySQL系统特性,MySQL初学基础,MySQL管理工具,如何安装MySQL及MySQL新特性,通过观看可掌握MySQL全套知识。
### MySQL常用查询状态命令知识点详解 #### 一、查看数据库版本 在MySQL中,了解数据库的具体版本对于确保使用的功能和特性是否可用至关重要。通过执行以下命令可以查看MySQL服务器的版本: ```sql mysql> SHOW ...
不同的存储引擎提供了不同的特性,例如事务处理能力、索引类型等。因此,了解如何配置存储引擎对于高效地使用MySQL至关重要。 ##### 1.1 问题背景 在实际的应用场景中,我们需要根据具体的需求来选择合适的存储...
1. 阅读MySQL官方文档,了解每个存储引擎的基本特性。 2. 分析源码,关注关键函数和数据结构,如引擎的表操作、索引操作、事务处理等。 3. 编写测试用例,实践源码中的功能,加深理解。 4. 参考社区资料,如MySQL的...
本篇文章将详细探讨两种最常用的存储引擎——InnoDB和MYISAM,以及如何在MySQL中查看这两种存储引擎的使用情况。 ### 1. InnoDB存储引擎 InnoDB是MySQL的默认存储引擎,它提供了事务处理、行级锁定以及外键约束等...
MySQL支持多种存储引擎,其中最常用的两种是MyISAM和InnoDB。 - **MyISAM**:早期默认的存储引擎,不支持事务处理,但具有较快的数据检索速度。 - **InnoDB**:5.5版本后成为默认的存储引擎,支持事务处理、行锁定...
接下来,我们将详细介绍几种常用的MySQL存储引擎: - **MyISAM**:这是MySQL的默认存储引擎之一,适用于Web应用和数据仓库环境。MyISAM不支持事务处理,但它提供了较快的读写速度,非常适合于读多写少的应用场景。 ...
### MySQL 常用函数及概念详解 #### 一、MySQL 数据库优化——重点函数与概念应用 在处理大规模数据时,对MySQL数据库进行优化至关重要。优化不仅能够提高查询速度,减少服务器负担,还能有效提升应用程序的整体...
INNODB存储引擎关键技术原理以及MYSQL常用规范 INNODB存储引擎是MYSQL数据库管理系统中的一种存储引擎,.INNODB存储引擎是MYSQL数据库管理系统中的一种存储引擎,以页为基本存储单位,一个页的大小固定为16KB。...
* MySQL 5.7 的新特性 * MySQL 下载和安装 * MySQL 免安装版配置教程 * MySQL 配置环境变量 * 安装 MySQL 后,如何判断是否已安装成功 * 启动 MySQL 服务 * 登录 MySQL 数据库 知识点4:MySQL 基本操作 * SQL 是...
本文将深入探讨 MySQL 数据库中常用的存储引擎,包括 InnoDB、MyISAM、Memory(HEAP)和 Archive 等。 一、InnoDB 存储引擎 InnoDB 是 MySQL 的默认存储引擎,它提供了强大的事务处理、行级锁定和外键约束功能。...
以上是MySQL常用功能的简单介绍,包括基础的数据操作、查询和高级功能如索引、存储引擎和表管理。掌握这些知识对于MySQL数据库的日常维护和应用开发至关重要。在实际工作中,还需要不断实践和深入学习,以便更好地...