mysql myisam和innodb的存储

--------------------------------------------------------------------myisam---------------------------------------------------------------------------------

MyISAM 是 MySQL 的默认存储引擎。MyISAM 不支持事务、也不支持外键,其优势是访
问的速度快,对事务完整性没有要求或者以 SELECT、INSERT 为主的应用基本上都可以使用
这个引擎来创建表。
每个 MyISAM 在磁盘上存储成 3 个文件,其文件名都和表名相同,但扩展名分别是:
 .frm(存储表定义);
 .MYD(MYData,存储数据);
 .MYI (MYIndex,存储索引)。
数据文件和索引文件可以放置在不同的目录,平均分布 IO,获得更快的速度。
要指定索引文件和数据文件的路径, 需要在创建表的时候通过 DATA DIRECTORY 和 INDEX
DIRECTORY 语句指定,也就是说不同 MyISAM 表的索引文件和数据文件可以放置到不同的路
径下。文件路径需要是绝对路径,并且具有访问权限。
MyISAM 类型的表可能会损坏,原因可能是多种多样的,损坏后的表可能不能访问,会
提示需要修复或者访问后返回错误的结果。 MyISAM 类型的表提供修复的工具, 可以用 CHECK
TABLE 语句来检查 MyISAM 表的健康,并用 REPAIR TABLE 语句修复一个损坏的 MyISAM 表。
表损坏可能导致数据库异常重新启动,需要尽快修复并尽可能地确认损坏的原因。具体的操
作步骤可以参见第 35 章应急处理。
MyISAM 的表又支持 3 种不同的存储格式,分别是:
 静态(固定长度)表;
 动态表;
 压缩表。
其中,静态表是默认的存储格式。静态表中的字段都是非变长字段,这样每个记录都是
固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是
占用的空间通常比动态表多。静态表的数据在存储的时候会按照列的宽度定义补足空格,但
是在应用访问的时候并不会得到这些空格,这些空格在返回给应用之前已经去掉。
但是也有些需要特别注意的问题,如果需要保存的内容后面本来就带有空格,那么在返
回结果的时候也会被去掉,开发人员在编写程序的时候需要特别注意,因为静态表是默认的
存储格式,开发人员可能并没有意识到这一点,从而丢失了尾部的空格。以下例子演示了插
入的记录包含空格时处理的情况:
mysql> create table Myisam_char (name char(10)) engine=myisam;
Query OK, 0 rows affected (0.04 sec)
mysql> insert into Myisam_char values('abcde'),('abcde '),(' abcde'),(' abcde ');
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select name,length(name) from Myisam_char;
+---------+--------------+
| name | length(name) |
+---------+--------------+
| abcde | 5 |
| abcde | 5 |
| abcde | 7 |
| abcde | 7 |
+---------+--------------+
4 rows in set (0.00 sec)
从上面的例子可以看出,插入记录后面的空格都被去掉了,前面的空格保留。
动态表中包含变长字段,记录不是固定长度的,这样存储的优点是占用的空间相对较少,但
是频繁地更新删除记录会产生碎片,需要定期执行 OPTIMIZE TABLE 语句或 myisamchk -r 命
令来改善性能,并且出现故障的时候恢复相对比较困难。
压缩表由 myisampack 工具创建,占据非常小的磁盘空间。因为每个记录是被单独压缩的,
所以只有非常小的访问开支。
 

----------------------------------------------------------------------innodb------------------------------------------------------------------------

InnoDB 存储表和索引有以下两种方式。
 使用共享表空间存储,这种方式创建的表的表结构保存在.frm 文件中,数据和索引
保存在 innodb_data_home_dir 和 innodb_data_file_path 定义的表空间中,可以是
多个文件。
 使用多表空间存储,这种方式创建的表的表结构仍然保存在.frm 文件中,但是每个
表的数据和索引单独保存在.ibd 中。如果是个分区表,则每个分区对应单独的.ibd
文件,文件名是“表名+分区名” ,可以在创建分区的时候指定每个分区的数据文件
的位置,以此来将表的 IO 均匀分布在多个磁盘上。
要使用多表空间的存储方式,需要设置参数 innodb_file_per_table,并重新启动服务后
才可以生效,对于新建的表按照多表空间的方式创建,已有的表仍然使用共享表空间存储。
如果将已有的多表空间方式修改回共享表空间的方式,则新建表会在共享表空间中创建,但
已有的多表空间的表仍然保存原来的访问方式。所以多表空间的参数生效后,只对新建的表
生效。
多表空间的数据文件没有大小限制,不需要设置初始大小,也不需要设置文件的最大限
制、扩展大小等参数。
对于使用多表空间特性的表,可以比较方便地进行单表备份和恢复操作,但是直接复
制.ibd 文件是不行的,因为没有共享表空间的数据字典信息,直接复制的.ibd 文件和.frm 文
件恢复时是不能被正确识别的,但可以通过以下命令:
ALTER TABLE tbl_name DISCARD TABLESPACE;
ALTER TABLE tbl_name IMPORT TABLESPACE;
将备份恢复到数据库中,但是这样的单表备份,只能恢复到表原来在的数据库中,而不
能恢复到其他的数据库中。如果要将单表恢复到目标数据库,则需要通过 mysqldump 和
mysqlimport 来实现。
注意:即便在多表空间的存储方式下,共享表空间仍然是必须的,InnoDB 把内部数据词典和未
作日志放在这个文件中。
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值