mysql存储引擎

释放双眼,带上耳机,听听看~!

存储引擎简介

MySQL可以将数据以不同的技术存储在文件(内存)中,这种技术就称为存储引擎。
每一种存储引擎都提供了不同的机制、索引技巧、锁定水平。最终提供了广泛且不同的功能
在关系型数据库中数据的存储是以表的形式存在的,所以存储引擎也可以称之为表类型

这里可以循环 show create table 表名查看到sql脚本在脚本中可以看到我们mysql 5.1 默认使用到的存储引擎是 InnoDB
mysql存储引擎

mysql中支持的存储引擎
MyIsam , Mrg_Myisam, InnoDB, Memory, Blackhole, CSV, Performance_Schema, Archive, Federated ,

可用通过 show engines 查看你的mySql的存储引擎
mysql存储引擎

相关知识的整理

在讲解存储引擎之前我先得跟你讲清楚几个概念

并发控制

概念:当多个连接对记录进行操作时保证数据的一致性和完整性。

例如: 一张数据表中,两个用户,其中一个用户删除id为22的商品,另一个用户查询id为22的商品,这样可能就会报错,这时就需要并发控制,在处理并发读或者并发写时,系统会使用锁系统解决该问题

共享锁(读锁):在同一时间段内,多个用户可以读取同一个资源,读取过程中不会发生任何变化。

排他锁(写锁):在任何时候只能有一个用户写入资源,当进行写锁时会阻塞其他的读锁或者写锁操作。这是出于安全策略的考虑。

锁颗粒:锁的单位
表锁:是一种开销最小的锁策略。整张表只有一个锁系统的开销自然就小了

行锁:是一种开销最大的锁策略。当然也只支持最大并非的一种情况。表中有多少条记录就有可能有多少把所,所以说对系统开销是非常的大

事务处理

事务作用:用于保证数据库的完整性。
事务的特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

各种存储引擎的特点

mysql存储引擎

MyIsam

MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。
MyIsam 存储引擎独立于操作系统,简单说就是可用在windows上使用,也可用将数据转移到Lunex操作系统上。系统兼容性很好!!!。
这种存储引擎在建表的时候,它会创建3个文件。分别是(.frm, .MYD, .MYI),简单说明一下:.frm 存储表的定义(也就是表结构啦),.MYD 就是表里面的数据,.MYD存储索引。这样的划分操作系统对大文件的操作是比较慢的,这样将表分为三个文件,那么.MYD这个文件单独来存放数据自然可以优化数据库的查询等操作。

特点:
1、不支持事务、不支持外键、对表进行加锁
2、查询速度很快。如果数据库insert和update的操作比较多的话采用表锁效率低(建议使用innodb)。
3、MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。
4、当把删除和更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片。这要通过合并相邻被删除的块,以及若下一个块被删除,就扩展到下一块自动完成。
5、每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16
6、NULL被允许在索引的列中,这个值占每个键的0~1个字节
7、可以把数据文件和索引文件放在不同目录(InnoDB是放在一个目录里面的)
MyISAM的引擎使用B+Tree作为索引结构,叶结点的data域存放的是数据记录的地址.
mysql存储引擎

MyISAM的索引文件仅仅保存数据记录的地址
在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复

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

MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。

支持3种不同的存储方式,分别是:静态表、动态表、压缩表
(1)静态表:静态表的字段都是非变常类型的。优点是非常迅速,容易缓存,出现故障容易恢复;缺点是占用空间通常比动态表多(因为存储是会按照宽度定义补足空格)

注意:在取数据时,会将数据后面的空格都去掉,如果数据后面本身有空格,那么也会被去掉

(2)动态表:记录不是固定长度的,这样的优点时空间占用少;缺点:频繁的跟新,删除表易造成碎片,需要定期执行OPTIMIZE TABLE或者myisamchk-r命令来改善性能

(3)压缩表:因为每个记录都是单独压缩的,所以只有非常小的访问开支

优点:系统兼容性好,属于查询速度贼快的那种。使用表格锁定的机制,来优化多个并发的读写操作。支持索引、字段管理。

缺点:不支持事务、外键、如果数据库insert和update的操作比较多的话采用表锁效率低(建议使用innodb)、不能在表损坏后恢复数据

使用场景
1、如果数据表主要用来查询记录引擎能提供较高的处理效率,想得到更好的系统兼容性。但是这个东西不支持事务、外键、如果更新表较多的话对效率也会有影响。

InnoDB

InnoDB是一个事务型的存储引擎(现在是mysql5.1 的默认存储引擎),有行级锁定和外键约束,提供了具有提交,回滚和崩溃恢复的事务安全,但是对比MyLSAM引擎,会占用更多的磁盘空间以保持数据和索引。

特点:
1、InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。这些功能增加了多用户部署和性能。在SQL查询中,可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合

2、InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系型数据库引擎锁不能匹敌的

3、InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上

4、InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键。

6、 更新多的表,适合处理多重并发的更新请求(因为是表锁)。
7. 可以从灾难中恢复(通过bin-log日志等)。
8. 支持自动增加列属性auto_increment。

InnoDB虽然也是B+Three作为索引结构,但是和MyISAM完全不同,
第一个重大区别是InnoDB的数据文件本身就是索引文件,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索 引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
mysql存储引擎
上图是InnoDB引擎的主索引的示图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身 要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列 作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。例如,下图为定义在Col3上的一个辅助索引:
mysql存储引擎
mysql存储引擎
使用场景:如果要提供提交、回滚、崩溃恢复能力的事务安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择

Mrg_Myisam

Mrg_Myisam 存储引擎,其实就是MyIsam的组合,它是将多个使用MyIsam引擎的表聚合,但是它内部没有数据,真正的数据依然是Mylsam引擎表中,但是可用进行删除更新等操作。

使用Mrg_Myisam的场景:同一种数据会根据数据的实践分为多个表,以达到提升效率的作用,这也就是我们常说的分库分表。如果这时要进行查询操作,会非常麻烦,因为你也不知道数据放在那个表里。Mrg_Myisam正式解决这种问题的存储引擎。Mrg_Myisam可以将多个表聚合成一个表统一查询,然后在删除Mrg_Myisam统一的表,原有数据不受影响。

Memory

Memory 采用的方案式使用内存当存储介质。但存储到内存上也导致了一个致命的问题就是当mySql进程崩溃的时数据会丢失。此外Memory对存储的数据有一定的要求,要求存储的是长度不变的数据。存储限制是由内存的大小来决定。

特点:
1、Memory表的每个表可以有多达32个索引,每个索引16列,以及500字节的最大键长度
2、Memory存储引擎支持hash和bTree索引
3、可以在一个Memory表中有非唯一键值
4、Memory表使用一个固定的记录长度格式
5、Memory不支持BLOB或TEXT列
6、Memory支持自动增长列和对可包含NULL值的列的索引
7、Memory表在所有客户端之间共享(就像其他任何非TEMPORARY表)
8、Memory表内存被存储在内存中,内存是Memory表和服务器在查询处理时的空闲中, 创建的内部表共享
9、当不再需要Memory表的内容时,要释放被Memory表使用的内存,应该执行DELETE FROM或TRUNCATE TABLE,或者删除整个表(使用DROP TABLE)

优点:数据访问快(使用内存做媒介),这是最大的特点

缺点:会占用服务器内存,如果内存非常紧张不推荐使用,而且数据可能会发送丢失,数据只能是临时数据,数据量不能太大,不然内存会溢出的。

Memory使用场景:
1、数据量小、访问非常频繁、在内存中存放数据,数据量过大会导致内存溢出。可以通过参数max_heap_table_size控制Memory表的大小,限制Memory表的最大的大小。
2、数据是临时数据,而且立即可用到。那么就比较合适存放在内存中。
3、存储在表中的数据如果丢失也没太大关系,不会造成损失。

Blackhole

江湖人称 “黑洞搜索引擎”。写入的数据都会消失,一般用做数据复制的中继。

CSV

文件结构:
.frm表结构描述
.csv数据
.csm表状态、当前记录数量等

特点:
1、没有索引、不能为NULL、不能自增
2、更新和删除时先写入到临时文件,然后在rnd_end()函数中重新生成数据文件
3、可以对数据文件直接编辑(保存文本文件内容)
4、以CSV格式进行数据存储(逗号隔开,引号)
5、数据以文本方式存储在文件中
6、CSV存储引擎可以将csv文件作为mysql的表进行处理。存储格式就是普通的csv文件。

优点:数据存储为CSV文件格式,不用进行转换,可以对数据文件直接编辑

缺点:不支持索引,不能为空,不能自增

Performace_Schema

MySql 5.5新出的一个存储引擎,主要是用来收集数据库服务器的性能参数。但是我们无法创建该类型的表,它都是有MySql系统自己创建的。

主要提供如下功能:
1、提供进程的详细信息包含了 锁、互斥变量、文件信息
2、保持历史的事件汇总信息,为MySql服务器的性能做出详细的判断。
3、对于新增和删除监控时间点都非常容易,并可以随意的改变Mysql服务器的监控周期
这个需要在配置文件my.cnf中进行配置才能生效。

Archive

archive是归档的意思,仅仅支持插入和查询两种功能,在MySQL5.5以后支持索引功能,他拥有很好的压缩机制,使用zlib压缩库,在记录请求的时候实时的进行压缩,经常被用来作为仓库使用。适合存储大量的独立的作为历史记录的数据。拥有很高的插入速度但是对查询的支持较差

使用场景:如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive

Federated

特点:

1、专门针对远程数据库的实现一般情况下在本地数据库中建表会在数据库目录中生成相应的表定义文件,并同时生成相应的数据文件。
但通过FEDERATED引擎创建的表只是在本地有表定义文件,数据文件则存在于远程数据库中通过这个引擎可以实现类似Oracle 下DBLINK的远程数据访问功能
2、本地的表结构必须与远程的完全一样。
3、远程数据库目前仅限MySQL
4、不支持事务
5、不支持表结构修改

优点:针对远程数据库实现、本地虚拟表与远程实体表之间是 TCP 长连接,并且是多个客户端利用的。所以不用担心因频繁建立连接带来的网络开销
缺点:远程数据库仅限MySql、不支持: 事务、表结构修改、 alter table 命令

使用场景:针对远程数据库实现。

设置数据库的存储引擎

【1】通过修改MySQL配置文件实现


1
2
3
1-default-storage-engine=engine(MySQL5.5默认使用Innodb存储引擎)
2
3

【2】通过创建数据表命令实现


1
2
3
4
5
1create table tp1 (
2   s1 varchar(10)
3) engine = MyISAM; -- 制定存储引擎为 MyISAM
4
5

mysql存储引擎

【3】通过修改数据表命令实现


1
2
3
1alter table tp1 engine = InnoDB --这是将tp1的存储引擎修改为 InnoDB
2
3

mysql存储引擎

InnoDB 和 MyISAM之间的区别

1>.InnoDB支持事物,而MyISAM不支持事物
2>.InnoDB支持行级锁,而MyISAM支持表级锁
3>.InnoDB支持MVCC, 而MyISAM不支持
4>.InnoDB支持外键,而MyISAM不支持
5>.InnoDB不支持全文索引,而MyISAM支持。(X)

给TA打赏
共{{data.count}}人
人已打赏
安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

安全运维

设计模式的设计原则

2021-12-12 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索