0
点赞
收藏
分享

微信扫一扫

MySQL数据库的数据表引擎

穆风1818 2022-02-28 阅读 95

1.InnoDB(默认引擎):InnoDB引擎提供了具有提交、回滚和崩溃恢复能力的安全事务。但是比MyISAM存储引擎,InnoDB写处理效率会差一些并且会占用更多的磁盘空间以保留数据和索引

  a.自动增长列

  InnoDB自动增长列可以手工插入,但是插入的值如果是空或者0,则实际上插入式自动增长后的值。对于InnoDB自动增长列必须是索引,如果是组合索引也必须是组合索引第一列,但是对于MyISAM表,自动增长列可以是组合索引其他列,例如创建一个MyISAM表,自动增长列d1作为组合列第二列,该表插入一些记录后,如下所示:

root@localhost:cyz--06:40:43 >create table aaa(d1 smallint not null auto_increment, d2 smallint not null, name varchar(10), index(d2,d1))engine=myisam;
Query OK, 0 rows affected (0.12 sec)

root@localhost:cyz--06:40:44 >insert into aaa(d2,name) values(2,'2'),(3,'3'),(4,'4'),(2,'2'),(3,'3'),(4,'4')
-> ;
Query OK, 6 rows affected (0.03 sec)
Records: 6 Duplicates: 0 Warnings: 0

root@localhost:cyz--06:41:30 >select * from aaa;
+----+----+------+
| d1 | d2 | name |
+----+----+------+
| 1 | 2 | 2 |
| 1 | 3 | 3 |
| 1 | 4 | 4 |
| 2 | 2 | 2 |
| 2 | 3 | 3 |
| 2 | 4 | 4 |
+----+----+------+
6 rows in set (0.00 sec)

  b.外键约束:

mysql支持外键的只有InnoDB

  c.存储方式:

共享表空间:表结构保存在.frm中,数据和索引保存在innodb_data_home_dir和innodb_data_file_path定义的表空间中,可以保存多个文件

独立表空间:需要设置innodb_file_per_tabel=1.只对新建的表起作用,原来该怎么保存还继续保存。表结构保存在.frm中,每个表的数据和索引单独保存到.ibd中,如果是分区表,每个分区对应单独的.ibd文件,文件名“表名+分区名”

单独表空间数据文件没有大小限制,不需要设置初始大小、最大限制、扩展大小等。

即使选择了单独表空间,共享表空间也是要存在的,需要InnoDB把内部的数据词典和undo放在这里

2.MyISAM:MyISAM不支持事物、不支持外键、表锁定、优势是访问速度快,对事物没有要求或者以select、insert为主的应用基本上都可以用这个引擎建表。每个MyISAM在磁盘上创建三个文件,文件名与表名相同,扩展名为

.frm(存储表定义)

MYD(存储数据)

MYI(存储索引)

数据文件和索引文件放置到不同的目录,平均分布IO,获得更快的速度,创建表时通过通过data directory和index directory语句指定,文件路径需要绝对路径,并且具有访问权限

  MyISAM表容易损坏,通过check table检查MyISAM表的健康,并用repair table语句修复损坏的MyISAM表。

  MyISAM表有三种存储格式:

静态(固定长度)表:

都是固定长度,优点:存储速度快、容易缓存、故障容易恢复。缺点:占用空间比动态大,按照列宽度定义补充空格,应用访问的时候不会得到这些空格

动态表:

包含变长字段,记录不固定长度,优点:占用空间较少。缺点:频繁的更新删除记录会产生碎片,需要定期执行optimize table或myisamchk -r来改善性能,故障出现后恢复相对困难

压缩表:

由myisampack工具创建,占用非常小的磁盘空间,因为每个记录被单独亚压缩,所以只有非常小的访问开支

3.MEMORY:  MEMORY存储引擎是使用内存中的内容创建表,每个memory表实际对应一个磁盘文件,格式是.frm,memory表访问速度非常快,默认是hash索引。

举报

相关推荐

0 条评论