MySql引擎

这里写图片描述

MySql服务层主要用于定义一些与存储引擎无关的东西,因为底层的存储引擎可能不同,所以不能依赖具体的存储引擎

存储引擎针对表而不是针对库,也就是一个数据库里的表存储引擎可以不同,但是这样不推荐。

//查看提供的存储引擎
mysql> show engines;
//查看默认存储引擎
mysql> show variables like '%storage_engine%';

+----------------------------------+--------+
| Variable_name                    | Value  |
+----------------------------------+--------+
| default_storage_engine           | InnoDB |
| default_tmp_storage_engine       | InnoDB |
| disabled_storage_engines         |        |
| internal_tmp_disk_storage_engine | InnoDB |
+----------------------------------+--------+

MyISAM

MyISAM存储引擎表由MYD(数据文件)和MYI(索引文件)组成

特性:

1. 并发性和锁级别

使用表级锁,也就是会对整张表进行加锁,进行读的时候加共享锁(S锁),进行写的时候加排他锁(X锁)
S锁:又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
X锁:又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。

2. 表损坏修复

支持对由于任意意外关闭而损坏的表的检查和修复,非事务恢复,它不支持事务

 check table tablename   //检查
 repair table tablename  //修复

命令演示
3.支持索引类型

支持全文索引-待补充

4.支持数据压缩

//为每一行进行压缩
myisampack -b -f tablename//压缩
//-b代表生成备份文件,-f为强制,因为此时数据较小,强制压缩

压缩

压缩后会生成备份文件,同时表为只读

mysql> insert into myisam values(1,1);
ERROR 1036 (HY000): Table 'myisam' is read only

限制
mysql版本小于5.0时默认表大小为4G,之后为256TB

可在建表时指定 MAX_ROWS和AVG_ROW_LENGTH2个参数相乘为表能达到的最大大小

使用场景
非事务型应用
只读类应用(可以对数据文件进行压缩)
空间类应用(地理位置信息等,空间函数)


Innodb

MySQL5.5之后版本默认存储引擎

Innodb使用表空间进行数据存储
变量为 innodb_file_per_table
参数为ON:使用独立表空间:tablename.ibd
参数为OFF:使用系统表空间:ibdataX

mysql> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
//创建一个表
create table innodb(id int, value varchar(20)) engine='innodb';
//查看存储方式
2018/07/27  10:23             8,588 innodb.frm
2018/07/27  10:23            98,304 innodb.ibd
//变成off
mysql> set global innodb_file_per_table=off;
//重新创建一个表
create table innodb2(id int, value varchar(20)) engine='innodb';
//查看存储
2018/07/27  10:23             8,588 innodb2.frm
//ibdata在上层目录,共享,不在该数据库目录下

5.5以及之前,默认为off
比较

系统表无法简单的收缩文件大小(在删除数据后,表文件大小不变,只是把表标志位改变,浪费空间,若要删除则必须到处数据,进行相应的删除,之后进行重建)
独立表空间可以通过optimize table命令收缩系统文件,可以对单表进行操作
系统表空间会产生IO瓶颈,因为所有表都向这一个文件写入数据,顺序进行,产生等待
独立表空间可以同时向多个文件刷新数据

特性
1.Innodb是一种事务性存储引擎

完全支持事务的ACID特性
事务使用Redo Log(已经提交的事务) Undo Log(没有提交的事务)

2.Innodb支持行级锁

提高并发程度,由存储引擎层实现

锁的粒度:行级,表级

//innodb默认行级锁,我们来尝试加表级锁,写锁
mysql> lock table innodb write;
//使用另一个连接尝试读取,被阻塞
mysql> select * from innodb;
//解锁
mysql> unlock tables;
//解锁后另一个连接已经可以正常执行了

//同样,我们可以加读锁
mysql> lock table innodb read;
//之后用另一个连接进行读取,是可以的
mysql> select id from innodb;
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
//若尝试进行插入,则会被阻塞
mysql> insert into innodb values(3,3);
//加写锁也会被阻塞,但是可以加读锁

Innodb状态检查

mysql> show engine innodb status;

CSV

数据以文本方式存储在文件中
.csv文件存储表内容
.csm文件存储表的元数据如表的状态和数据量
.frm文件存储表结构信息,不论哪种存储引擎都有这个文件

特点
1.以CSV格式进行数据存储
2.所有列必须都是不能为NULL的
3.不支持索引,不适合大表
4.可以对数据文件直接编辑

演示

//csv不支持列为空
mysql> create table csv (id int, v1 varchar(10),v2 varchar(10)) engine=csv;
ERROR 1178 (42000): The storage engine for the table doesn't support nullable columns

//正确创建
mysql> create table csv (id int not null, v1 varchar(10) not null,v2 varchar(10) not null) engine=csv;

//插入内容
mysql> insert into csv values(1,1,1),(2,2,2);

最终结果
这里写图片描述
我们把他编辑,增加一行
额,文件是只读的,最好还是不要去编辑了

//尝试去建立索引,提示最多0keys。。那就是不支持了
mysql>  create index idx_id on csv(id);
ERROR 1069 (42000): Too many keys specified; max 0 keys allowed

适用场景
适合作为数据交换的中间表,其他应用把电子表格生成为csv文件供数据库读取,或把数据写到csv供其它应用读取


Archive

文件系统存储特点
以zlib对表数据进行压缩,磁盘I/O更少
数据存储在ARZ为后缀的文件中

只支持insert和select操作
只支持在自增ID列上加索引

//建表操作,key(id)表示建立索引
mysql> create table archive (id int auto_increment not null, v1 varchar(10), key(id))engine=archive;
//插入数据
mysql> insert archive(v1) values(1),(2);
//查询
mysql> select * from archive;
+----+------+
| id | v1   |
+----+------+
|  1 | 1    |
|  2 | 2    |
+----+------+
//更新操作,提示不支持该操作
mysql> update archive set v1 = 2 where id = 1;
ERROR 1031 (HY000): Table storage engine for 'archive' doesn't have this option
//删除操作
mysql> delete from archive where id = 1;
ERROR 1031 (HY000): Table storage engine for 'archive' doesn't have this option
//建立索引,出错,最多支持一个key,但是这个key必须是自增id
mysql> create index idx_v1 on archive(v1);
ERROR 1069 (42000): Too many keys specified; max 1 keys allowed

使用场景
日志和数据采集类应用


Memory(HEAP)

数据保存在内存中
若数据库服务器重启,则数据丢失,但表结构不会丢失,因为表结构为frm文件,存在磁盘

功能特点
1.支持Hash索引和BTree索引,默认为Hash,innodb和myisam默认为BTree,不支持Hash
2.所有字段都为固定长度,例:varchar(10) = char(10)
3.不支持blob和text等大字段
4.使用表级锁
5.表的最大大小由max_heap_table_size决定,默认16M,对已经存在的表无效

//尝试建立含有text字段的表,提示不支持
mysql> create table memory(id int, v1 char(10), v2 varchar(10), v3 text)engine=memory;
ERROR 1163 (42000): The used table type doesn't support BLOB/TEXT columns
//删掉这个字段,重建
mysql> create table memory(id int, v1 char(10), v2 varchar(10))engine=memory;

使用场景
1.用于查找或者是映射表,例如邮编和地区的对应表
2.用于保存数据分析中产生的中间表
3.用于缓存周期性聚合数据的结果表


Federated

提供了远程访问MySQL服务器上表的方法
本地不存储数据,数据全部放到远程服务器上
本地需要保存表结构和远程服务器的连接信息

默认禁止,启动需要在启动时增加federated参数
windows下,关闭mysql服务,在my.ini加上federated=1,打开mysql服务即可

//创建远程数据库
mysql> create database remote;
mysql> use remote
//创建表,默认使用innodb引擎,我是5.7版本
mysql> create table remote_fed(id int, v1 varchar(10));
//插入数据
mysql> insert remote_fed values(1,1),(2,2),(3,3);
//进行用户的授权
mysql> grant all on remote.remote_fed to user@'127.0.0.1' identified by 'user';

//创建本地数据库
mysql> create database local;
mysql> use local
//创建本地表,同时要指定使用federated引擎,指定连接,参数为用户名,密码,远程库地址,数据库,表
mysql> create table local_fed(id int, v1 varchar(10)) engine=federated connection='mysql://user:user@127.0.0.1:3306/remote/remote_fed';

//进行查询,查询出的是远程库的数据
mysql> select * from local_fed;
+------+------+
| id   | v1   |
+------+------+
|    1 | 1    |
|    2 | 2    |
|    3 | 3    |
+------+------+
//进行删除
mysql> delete from local_fed where id = 1;
mysql> use remote;
Database changed

//在远程库中进行查询,数据已经被删掉
mysql> select * from remote_fed;
+------+------+
| id   | v1   |
+------+------+
|    2 | 2    |
|    3 | 3    |
+------+------+

使用场景
偶尔的统计分析及手工查询


如何选择正确的存储引擎

  • 事务
  • 备份
  • 崩溃回复
  • 存储引擎的特有特性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL 数据库管理系统支持多种数据库引擎。每种数据库引擎都有不同的特点,适用于不同的用例。 常见的 MySQL 数据库引擎包括: - MyISAM:MyISAM 是 MySQL 的默认引擎,在性能和数据完整性方面表现良好。它支持全文索引,但不支持事务和行级锁定。 - InnoDB:InnoDB 是一种支持事务处理和行级锁定的引擎。它通常被用于需要高可用性和数据完整性的应用程序。 - Memory:Memory 引擎将数据存储在内存中,速度非常快,但数据不能持久化。它通常用于临时存储数据或缓存数据。 - CSV:CSV 引擎允许将数据存储在 CSV 格式的文件中,并提供对 CSV 文件的简单查询支持。 - Archive:Archive 引擎提供了一种高压缩比的方式来存储大量只读数据。它不支持索引,因此只能用于存储历史数据或进行批量加载。 在选择 MySQL 数据库引擎时,应考虑应用程序的性能、可用性、数据完整性以及其他特定需求,并根据这些因素来决定最后使用哪 ### 回答2: MySQL引擎是用于存储和管理数据库数据的关键组件。MySQL提供了多种不同的引擎,每个引擎都具有其独特的特点和优势。下面是一些常见的MySQL引擎及其区别: 1. MyISAM引擎:这是MySQL最早的引擎,它使用表级锁定机制,适用于读取频率高于写入频率的场景。但是,它不支持事务处理和数据完整性的约束,因此在需要ACID事务支持的应用中不适用。 2. InnoDB引擎:这是MySQL默认的事务性存储引擎,它支持ACID事务、行级锁定和外键约束等重要特性。它适用于需要高可靠性和数据完整性的应用。InnoDB引擎通过自动将数据缓存到内存中来提高性能,并具有崩溃恢复功能,可以在数据库崩溃后恢复数据。 3. Memory引擎:也称为Heap引擎,它将表中的数据存储在内存中,因此读取速度非常快。然而,由于数据存储在内存中,所以在数据库崩溃时数据会丢失。Memory引擎适用于临时数据、缓存和临时表等应用场景。 4. NDB Cluster引擎:也称为MySQL Cluster引擎,它通过将数据分布在多个节点上来提供高可用性和性能。NDB Cluster引擎适合于需要高并发访问和高可用性的大规模应用,如电信、金融和电子商务等领域。 5. Archive引擎:这是一种非事务性存储引擎,适用于归档和大量读取少量写入的应用。它以高度压缩的方式存储数据,节省了存储空间。Archive引擎不支持索引,只能进行全表扫描操作。 根据应用的需求和特点,选择合适的MySQL引擎可以提供更好的性能、可用性和数据完整性。 ### 回答3: MySQL是一种关系型数据库管理系统,它有多个可用的引擎来处理和存储数据。在MySQL中,常用的引擎包括InnoDB、MyISAM、MEMORY、CSV等。 首先,InnoDB是MySQL的默认引擎,并且在性能和功能上提供了许多优势。它支持事务处理、行级锁和外键约束等特性,适合于需要高并发读写的应用。InnoDB还提供了自动崩溃恢复机制,可以在数据库发生崩溃时保证数据的一致性。 其次,MyISAM是另一个常用的引擎,适用于一些读取频率高但写入频率较低的应用。它的优点是速度快,支持全文索引和空间索引,但不支持事务和行级锁定,也不具备自动崩溃恢复的功能。 另外,MEMORY引擎适用于数据量较小的表,将数据存储在内存中,读写速度非常快。然而,一旦MySQL服务器关闭,数据将丢失,不具备持久性。 此外,CSV引擎用于处理以逗号分隔的值(CSV)文件,它允许将CSV文件视为表,并进行查询和修改。但是,与其他引擎相比,CSV引擎的功能相对有限。 总之,不同的引擎适用于不同的应用场景。选择适合的引擎可以提高数据库的性能和效率,并满足应用的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值