数据库 之 Mysql存储引擎介绍

1  存储引擎概念介绍

存储引擎其实就是如何实现存储数据,如何为存储的数据建立索引以及如何更新,查询数据等技术实现的方法。数据库中的存储引擎其实是对使用了该引擎的表进行某种设置,数据库中的表设定了什么存储引擎,那么该表在数据存储方式、数据更新方式、数据查询性能以及是否支持索引等方面就会有不同的“效果”。

通过选择不同的存储引擎,获得额外的速度或者功能,从而改善服务器的应用的整体功能。例如,如果你在研究大量的临时数据,你也许需要使用内存MySQL存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。这些不同的技术以及配套的相关功能在 MySQL中被称作存储引擎(也称作表类型)。 MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。

2  Mysql概念介绍

插件式存储引擎是MySql数据库最重要的特性之一,用户可以根据应用的需要选择如何存储和索引数据、是否使用事务等。

MySQL中的数据用各种不同的技术存储在文件(或内存)中,这些技术中的每一种技术都使用不同的存储机制,索引技巧,锁定水平并且最终提供广泛的不同功能和能力。在MySQL中将这些不同的技术及配套的相关功能称为存储引擎。

用命令SHOW ENGINES可以查看mysql中支持的存储引擎。MySql5.0支持的存储引擎包括MyISAM、InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDB Cluster、ARCHIVE、CVS、BLACKHOLE、FEDERATED等,其中只有InnoDB和BDB提供事务安全表,其他存储引擎都是非事务安全表。

创建新表时如果不指定存储引擎,系统将使用默认的存储引擎,MySql5.5之前默认的存储引擎是MyISAM,5.5之后改为了InnoDB。如果要修改默认的存储引擎,可以在参数文件中设置default-table-type。

mysql分支主流有以下三种:

mysql-->oracle公司

mariadb:真正的开源mysql,吸取社区研发的结果,存储引擎为Aria,是MyISAM的增强版,可以做奔溃后安全恢复,mariadb的引擎有以下三个:

MyISAM-->Aria

InnoDB-->Xtra(Percona公司做补丁到InnoDB,所以性能更好)

tokudb:支持海量存储

Percona-server(Percona公司发行的mysql数据库另一个分支)

3  Mysql  配置文件介绍

查看配置文件的顺序,同一配置项出现在多个配置文件中,后出现的配置生效,同时,可以用选项defaults-extra-file或者 --defaults-file来定义额外加载的配置文件的路径

[[email protected] script]#my_print_defaults --verbose

Default options are read from the following files in the given order:

/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf

例子

常用配置

vim /etc/my.cnf.d/server.cnf

[server]

skip_name_resolve = ON #跳过名称解析

innodb_file_per_table = ON #每表使用独立的表空间

max_connections = 20000 #最大并发连接数

每一个数据库相当于是路径 /var/lib/mysql/下的子目录,如创建一个数据库为sunny,那么在路径/var/lib/mysql/下就会生成一个目录为sunny,但是不能直接在目录/var/lib/mysql/创建子目录,否则会出现问题,不能生成新的数据库

4  InnoDB引擎介绍

InnoDB,是MySQL的数据库引擎之一,为MySQL AB发布binary的标准之一。InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能,类似于PostgreSQL。

innodb是事务型存储引擎,适合对事务要求较高的场景中;但较适用于处理大量短期事务(即小事务,即少量语句,如十几个语句的处理);

基于MVCC(Mutli Version Concurrency Control)支持高并发;支持四个隔离级别,默认级别为REPEATABLE-READ;间隙锁以防止幻读;

使用聚集索引(主键索引);索引和内容放在一起。一般是有序的,聚集索引只能一个,其他索引都是非聚集的,MyISAM没有聚集索引

支持”自适应Hash索引“;键值数据,即kv

锁粒度:行级锁;间隙锁;关系型数据库写锁是独占的;

行级锁:innodb改一行只锁一行,行级别的力度。myISAM修改一行需要把整张表锁掉

间隙锁:锁住行和行直接的间隙,如查询的是两行的信息时,有操作需要在这两行间插入新的记录,这里的间隙锁,就是锁住两行间的间隙,使得不能在两行间插入间隙

例子:事务的解释

事务型如A账号里减去80,B账号里加80,但是万一系统此时异常,A减去后B还没加,这个是不允许的,要么系统正常后,B加上80,要么A减去的80被还原,这个是基于事务完成的

事务是可交叉并行的,但是要考虑到隔离性

查看所有表的状态信息(表属性),如下语句,\G将竖排显示内容,且每行显示一次,如果有多行信息,将会分别显示多次

MariaDB [sunny]> show table status\G;

从物理意义上来讲,InnoDB表由共享表空间、日志文件组(redo文件组)、表结构定义文件组成。若将innodb_file_per_table设置为on,则系统将为每一个表单独的生成一个table_name.ibd的文件,在此文件中,存储与该表相关的数据、索引、表的内部数据字典信息。表结构文件则以.frm结尾,这与存储引擎无关。

数据存储于“表空间(table space)"中,有两种方式:

(1) 所有数据库中的所有类型为InnoDB的表的数据和索引存储于同一个表空间中;

表空间文件:datadir定义的目录中,如默认/var/lib/mysql/路径下,表现为ibdata1, ibdata2, …等文件,文件数量和表数量并不一定是对应的

(2) innodb_file_per_table=ON,意味着每表使用单独的表空间文件;

每表的数据文件(数据和索引,存储于数据库目录)存储于自己专用的表空间文件中,并存储于数据库目录下: tbl_name.ibd(表名.ibd)如数据库sunny下的表classlist,那么表空间文件为/var/lib/mysql/sunny/classlist.ibd。

表结构的定义:在数据库目录,tbl_name.frm(表名.frm) ,如/var/lib/mysql/sunny/classlist.frm,即存储表格式

ibdata1介绍

innodb系统表空间文件ibdata1存放三种数据:

a)回滚段

b)所有innodb表元数据信息(这就是为什么innodb无法像myisam表一样,直接将表定义文件(表名.frm) 和表数据文件(表名.ibd)拷贝到另一个库中,因为还有部分元数据信息在ibdata1文件中)

c)double write,insert buffer dump 等等

innodb_file_per_table介绍

innodb_file_per_table开启后,会产生表定义文件表名.frm,和表数据文件  表名.idb,这样每个表的数据都会存在自己的.idb文件中;如果 关闭,那么所有的数据都会 存在系统表空间文件 ibdata1文件中,这会ibdata1 非常繁忙并且臃肿 庞大,而且ibdata1无法 收缩的,比如线上将一个 大的表 drop掉,此时ibdata1是无法自动缩小的(需要使用 optimiza table 来优化);而如果开启,数据存在 .idb文件中,则可以随时缩小;

共享表空间和独立表空间优缺点

共享表空间与独占表空间可以通过参数innodb_file_per_table来转换,若为1,则开启独占表空间,否则,开启共享表存储。

在服务器资源有限,单表数据不是特别多的情况下, 独立表空间明显比共享方式效率更高 . 但是MySQL 默认是共享表空间 。

具体的共享表空间和独立表空间优缺点如下:

共享表空间:

优点:

可以放表空间分成多个文件存放到各个磁盘上(表空间文件大小不受表大小的限制,如一个表可以分布在不同步的文件上)。数据和文件放在一起方便管理。

缺点:

所有的数据和索引存放到一个文件中以为着将有一个很常大的文件,虽然可以把一个大文件分成多个小文件,但是多个表及索引在表空间中混合存储,这样对于一个表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析,日值系统这类应用最不适合用共享表空间。

独立表空间:

优点:

1.每个表都有自已独立的表空间。

2.每个表的数据和索引都会存在自已的表空间中。

3.可以实现单表在不同的数据库中移动。

4.空间可以回收(除drop table操作处,表空不能自已回收)

a) Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过:alter table TableName engine=innodb;回缩不用的空间。

b) 对于使innodb-plugin的Innodb使用truncate table也会使空间收缩。

c) 对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。

缺点:

单表增加过大,如超过100个G。

注意事项:

※ 对于启用了innodb_file_per_table 的参数选项之后,在每个表对应的.idb文件内只是存放了数据、索引和插入缓冲,而撤销(undo)信息,系统事务信息,二次写缓冲等还是存放在了原来的共享表空间内。

※ 数据段即B+树的叶节点,索引段即为B+树的非索引节点。

※ InnoDB存储引擎的管理是由引擎本身完成的,表空间是由分散的页和段组成。

※ 区由64个连续的页组成,每个页大小为16K,即每个区大小为1MB,创建新表时,先有32页大小的碎片页存放数据,使用完后才是区的申请,(InnoDB最多每次申请4个区,保证数据的顺序性能)

※ 页类型有:数据页、Undo页、系统页、事务数据页、插入缓冲位图页、以及插入缓冲空闲列表页。

innodb小结:innodb的特点

数据存储:表空间;

并发:MVCC,间隙锁,行级锁;

索引:聚集索引、辅助索引;

性能:预读操作、内存数据缓冲、内存索引缓存、自适应Hash索引、插入操作缓存区;

备份:支持热备;备份是重点知识。

查看存储引擎的状态信息,如InnoDB的状态

SHOW ENGINE INNODB STATUS;

5  MyISAM引擎介绍

MyISAM的特点:

支持全文索引(FULLTEXT index)、压缩、空间函数(GIS);这些是innodb不支持的特性

不支持事务

锁粒度:表级锁

崩溃无法保证表安全恢复

适用场景:只读(数据仓库)或读多写少的场景、较小的表(以保证崩溃后恢复的时间较短);

文件:每个表有三个文件,存储于数据库目录中

tbl_name.frm:表格式定义;约束,数据结构

tbl_name.MYD:数据文件;

tbl_name.MYI:索引文件;

例子

创建表tbl1,指定引擎为MyISAM,那么在路径/var/lib/mysql/sunny下就会生成三张表tbl1.frm  tbl1.MYD  tbl1.MYI

create table tbl1 (ID int,name char(4)) engine=MyISAM;

特性:

加锁和并发:表级锁;

修复:手动或自动修复、但可能会丢失数据;

索引:非聚集索引;

延迟索引更新;

表压缩;

innodb支持在线事务,myISAM支持只读的数据仓库或者读多写少的场景

6  其它的存储引擎

CSV:将CSV文件(以逗号分隔字段的文本文件)作为MySQL表文件;

MRG_MYISAM:将多个MyISAM表合并成的虚拟表;

BLACKHOLE:黑洞,类似于/dev/null,不真正存储数据;存进来的数据全部丢弃

MEMORY:内存存储引擎,支持hash索引,表级锁,常用于临时表;不能持久存储

FEDERATED: 用于访问其它远程MySQL服务器上表的存储引擎接口;

MariaDB额外支持很多种存储引擎:

OQGraph、SphinxSE、TokuDB、Cassandra、CONNECT、SQUENCE、...

InnoDB内容参考如下内容

https://www.cnblogs.com/benshan/archive/2013/01/08/2851714.html

https://www.cnblogs.com/Aiapple/p/5689634.html

https://baike.baidu.com/item/innodb/8970025?fr=aladdin

原文地址:http://blog.51cto.com/ghbsunny/2060542

时间: 2024-11-02 04:52:01

数据库 之 Mysql存储引擎介绍的相关文章

mysql 存储引擎介绍

一  存储引擎解释 首先确定一点,存储引擎的概念是MySQL里面才有的,不是所有的关系型数据库都有存储引擎这个概念,后面我们还会说,但是现在要确定这一点. 在讲清楚什么是存储引擎之前,我们先来个比喻,我们都知道录制一个视频文件,可以转换成不同的格式,例如mp4,avi,wmv等,而存在我们电脑的磁盘上也会存在于不同类型的文件系统中如windows里常见的ntfs.fat32,存在于linux里常见的ext3,ext4,xfs,但是,给我们或者用户看懂实际视频内容都是一样的.直观区别是,占用系统的

MySQL存储引擎介绍 w

一 存储引擎解释 首先确定一点,存储引擎的概念是MySQL里面才有的,不是所有的关系型数据库都有存储引擎这个概念,后面我们还会说,但是现在要确定这一点. 在讲清楚什么是存储引擎之前,我们先来个比喻,我们都知道录制一个视频文件,可以转换成不同的格式,例如mp4,avi,wmv等,而存在我们电脑的磁盘上也会存在于不同类型的文件系统中如windows里常见的ntfs.fat32,存在于linux里常见的ext3,ext4,xfs,但是,给我们或者用户看懂实际视频内容都是一样的.直观区别是,占用系统的空

第三章 MySQL存储引擎介绍

1 MySQL存储引擎的概念 MySQL中数据用各种不同的技术存储在文件(或内存)中,这些技术都使用不同的存储机制.索引技巧,锁定水平,并且最终提供广泛的.不同的功能,通过选择不同的技术,能够获得额外的速度或功能,从而改善整体功能. SQLServer和Oracle都使用了一种存储引擎,而MySQL有多种存储引擎. 所谓的存储引擎,其实就是表的类型 2 查询MySQL中支持的存储引擎 show engines; show engines \g show variables like 'have%

MySQL存储引擎介绍

MySQL主要有两个层次组成:MySQL核心[MySQL服务器层].插件式存储引擎    MySQL处理机制无论在核心上如何被解析,最后如果真正实现跟文件系统上的文件交互时,一定要经过存储引擎来完成.真正把MySQL操作接收下来并提交给底层文件上对应的数据完成操作,并将结果返回给上层MySQL核心的是MySQL存储引擎,各存储引擎通过统一的API向MySQL服务器提供一个统一的数据存取.加锁等操作.        MySQL内部表状态信息查看,使用  show table status like

mysql 存储引擎介绍2

了解MYSQL的都知道,在MYSQL中建立任何一张数据表,在其数据目录对应的数据库目录下都有对应表的.frm文件,.frm文件是用来保存每个数据表的元数据(meta)信息,包括表结构的定义等,.frm文件跟数据库存储引擎无关,也就是任何存储引擎的数据表都必须有.frm文件,命名方式为数据表名.frm,如user.frm. .frm文件可以用来在数据库崩溃时恢复表结构. MySQL文件包括MySQL所建数据库文件和MySQL所用引擎创建的数据库文件. .frm 文件与操作系统和数据库引擎无关,都有

mysql 存储引擎介绍1

1.1  存储引擎的使用 数据库中的各表均被(在创建表时)指定的存储引擎来处理. 服务器可用的引擎依赖于以下因素: MySQL的版本 服务器在开发时如何被配置 启动选项 为了解当前服务器中有哪些存储引擎可用,可使用SHOW ENGINES语句: mysql> SHOW ENGINES\G 在创建表时,可使用ENGINE选项为CREATE TABLE语句显式指定存储引擎. CREATE TABLE t (i INT) ENGINE = MyISAM; 如果在创建表时没有显式指定存储引擎,则该表使用

mysql 存储引擎 介绍

一.InnodDB InnoDB表是基于聚蔟索引建立的,默认级别是 REPEATABLE_READ(可重复读),支持热备份,mysql 的其它引擎不支持. 支持行级锁,用来处理大量的 短期事务.InnodDB的性能和自动崩溃恢复特性,但得它在非事务型存储的需求中中也很流行.除非有非常的特别的原因需要使用其它的存储引擎,否则应该优先考虑InnoDB引擎. 二.MyISAM MyISAM提供了大量的特性,包括全文索引.压缩.空间函数(GIS)等,但MyISAM不支持事务和行级锁而且有一个毫无疑问的缺

mysql存储引擎介绍,索引

区别: MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能.两种类型最主要的差别就是Innodb  支持事务处理与外键和行级锁.而MyISAM不支持.myisam不支持事务,也不支持外键,其优势是访问速度快(INNODB在做SELECT的时候,要维护的东西比MYISAM引擎多很多,并且会占用更多的磁盘空间以保留数据和索引),对事务完整性没有要

02: MySQL 索引类型 、 MySQL 存储引擎

day02一.mysql索引二.MySQL存储引擎+++++++++++++++++++++++++++++++++++一.mysql索引1.1 索引介绍 : 相当于 "书的目录" 5000页1~200 目录信息拼音排序部首排序笔画排序 201~5000 正文 1.2 索引的优点与缺点?优点 加快查询的速度缺点 占用物理存储空间,减慢写的速度. 姓名 性别 班级 年龄jimjimNULL 1.3 使用普通索引index:(在表中的字段上创建索引)使用规则?查看 desc 表名: key