我是靠谱客的博主 真实白羊,最近开发中收集的这篇文章主要介绍常用MySQL存储引擎,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

常用MySQL存储引擎

1)概述:MySQL数据库支持多种存储引擎,用户可以通过选择使用不同的存储引擎提高应用的效率,提供存储的灵活性。当前使用的是MySQL 8.0,支持以下数据库引擎,其中InnoDB提供事务完全表,也是MySQL 8.0 的默认数据库存储引擎。

EngineSupport
MEMORYYES
MRG_MYISAMYES
CSVYES
FEDERATEDNO
PERFORMANCE_SCHEMAYES
MyISAMYES
InnoDBDEFAULT
BLACKHOLEYES
ARCHIVEYES

2)创建新表时,可以指定该表的数据库存储引擎。

​
create table newTable(
 
i int(20) not null auto_increment,
primary key(i)
)engine=MyISAm default charset = utf8;//创建新表直接指定表的存储引擎
​

当然 ,如果你创建后发现不是你想要的数据库存储引擎也可以更改。

alter table newTable engine = InnoDB;//将上面创建的表格的引擎个更换为InnoDB

3)常用存储引擎对比

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

下面详细介绍上面四种数据库存储引擎:

1、MyISAM

MyISAM不支持事务,也不支持外键,它的优势在于访问速度快,对事务的完整性没有要求,因此,以select、insert命令为主的应用基本上都可以使用这个引擎来创建表。

每个MyISAM在磁盘上行存储成3个文件,每个文件的文件名都和表名相同,只是扩展名不同:

例如:user表

1)user.frm 存储表定义

2)user.MYD 存储数据

3)user.MYI 存储索引

数据文件和索引文件可以放在在不同的目录,平均分布IO,可以获得更快的速度。

MyISAM还可以支持3中不同的存储格式,分别是:

1)静态表(固定长度)

2)动态表

3)压缩表

其中,静态表是默认的存储格式。因为存储的字段都是定长的,所以这种存储方式的优点是:存储非常的迅速,容易缓存,出现故障容易恢复;缺点是:占用的空间通常比动态表多。

特别需要注意一点:由于静态表的数据存储时会按照列的宽度定义补足空格,但是在应用访问时并不会得到这些空格,因为这些空格在返回给应用之前就已经去掉了,所以,在保存数据时,如果本身数据尾部有空格,并且在默认的存储格式(静态表)下,就会造成尾部数据的丢失。

动态表中包含长字段,记录时不是固定长度的,这样存储的优点是:占用空间比较少;缺点是:如果频繁的更新和删除记录会产生碎片,需要定期的维护,使用OPTIMIZE TABLE语句 或者 myisamchk-r命令来改善性能,并且在出现故障时相对比较困难。

压缩表有myisampack工具创建,占据非常晓得磁盘空间。因为每个记录时被单独压缩的,所以开支非常小。

2、InnoDB

InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyIASM存储引擎,InnoDB的写的处理效率要差一点,并且会占用给更多的磁盘来存储数据和索引。

1)自动增长

InnoDB表的自动增长列可以手工插入,但是插入后的值如果是0或者null,那么真实插入的值将会是自动增长过后的值。

举个简单的栗子:

建一张表,存储引擎是InnoDB,设置i为主键且自增,还有一列是name。

create table increTable(
i int(20) not null auto_increment,
name varchar(20),
primary key(i)
)engine = InnoDB;

现在插入数据:

insert increTable values(1,"hhx"),(4,"kkj"),(0,"llo"),(null,"wq");

查询结果:

iname
1hhx
4kkj
5llo
6wq

可以看到我们手动插入自增列后带来的影响,i 从1跳到4 ,这是手动添加的结果,后面的添加的i为0或者为空,就存入自动增长后的值。

这里还可以强制设置自增的初始值(默认从1开始),使用如下语句:

alter table increTable auto_increment = 5; //强制设置从5开始自增

插入值:

insert into increTable(name) values("hhx"),("gt"),("zhj"),("dqx");

查询结果:

iname
5hhx
6gt
7zhj
8dqx

可以看出已经设置成功了。这里需要注意的是:这个强制设置的值是存储在内存里面的,如果数据库重启,那么这个值会丢失,需要重新设置。

另外,对于InnoDB表,自动增长列必须使索引。如果是组合索引,那么也必须是组合索引的第一列。但是对于MyISAM表来说,就没有这么严格了,自增列可以是组合索引的其他列。

2)外键约束

MySQL支持外键的存储引擎只用InnoDB,在创建外键时,要求父表必须有对应的索引,子表在创建外键时也会自动创建对应的索引。

当某个表被其他表创建了外键参照,那么该表的对应索引或者主键禁止被删除。

关闭外键和恢复外键的命令:

set foreign_key_checks   =  0 ; //关闭外键
set foreign_key_checks   =  1 ; //开启外键

查看外键信息的命令:

show create  table;//第一种
show table status;//第二种

3)存储方式

InnoDB存储表和索引的方式有两种。

第一种:使用共享表空间存储,这种方式创建的表结构保存在.frm文件中,数据和索引保存在 innodb_data_home_dir 和 innodb_data_file_path定义的表空间中,可以是多个文件。

第二种:使用多表空间存储,表结构仍然保存在.rem中,但是每个表的数据和索引单独保存在.ibd中。如果是个分区表,则每个分区表对应单独的.ibd文件,文件名是“表名+分区名”,可以在创建分区时指定每个分区的数据文件的位置,以此来讲表的IO均匀分布在多个磁盘上。

这里需要注意一点:即使是在多表空间的存储方式下,共享表空间仍然是必须的,InnoDB把内部数据词典和在线重做日志放在这个文件中。

3、MEMORY

MEMORY存储引擎使用存在于内存中的内容来创建表。每个表只对应一个磁盘文件,格式为.frm。MEMORY类型的表将数据放在内存中,因此访问速度非常快,并且默认使用HASH索引,但是一旦关闭服务,表中的数据就会丢失掉。

MEMORY存储引擎下的表创建索引是,可以指定使用HASH索引还是BTREE索引。

可以使用下面的命令查看当前MEMROY存储引擎下的表是使用的什么索引。

show index from table;

另外,服务器需要足够的内存来位置所有在同一时间使用的MEMORY表,不在需要使用时,要释放表的内存,应该执行 delete from 或者truncate table,或者将整个表直接删除(drop table)。

每个MEMORY表中的存放的数据大小,收到max_heap_table_size系统变量的约束,初始值是16MB,但是可以加大。此外,定义该类型的表时,可以使用max_rows语句来指定表的最大行数。

需要注意的是:对MEMORY类型的表进行更新操作时,需要谨慎一点,因为数据没有写到磁盘里,所以要对下次重启服务后活的到这些修改后的数据有所考虑。

4、MERGE

MERGE存储引擎是一组MyISAM表的组合。这些MyISAM表的结构必须完全相同,MERGE表本身没有数据,对MERGE表的查询、更新等操作是对内部的MyISAM表进行的。另外,当对MERGE表进行删除操作时,只是删除了MERGE表的额定义,对内部的表没有任何的影响。

MERGE表在磁盘上保留两个文件,一个是.frm文件存储表的定义;另外一个.MRG文件包含组合表的信息,其中包括了MERGE表由哪些表组成、插入新的数据时的依据,可以通过修改.MEG文件来修改MERGE表,修改后记得使用flush tables刷新表。

最后

以上就是真实白羊为你收集整理的常用MySQL存储引擎的全部内容,希望文章能够帮你解决常用MySQL存储引擎所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部