MySQL基础之 存储引擎
MyISAM存储引擎
缺点:不支持事务,不支持外键。只支持表级锁。
优点:访问速度快,多用于select、insert语句的高负载操作。仅仅支持全文索引。
MyISAM缓存在内存的是索引,不是数据。而InnoDB缓存在内存的是数据,相对来说,服务器内存越大,InnoDB发挥的优势越大
Myisam的存储文件:
每个MyISAM在磁盘上存储程3个文件,文件名和表名是相同的,仅仅扩展名不一样:
1、filename.frm:存储表定义
2、filename.MYD:mydata,即存储的数据
3、filename.MYI:myindex,即存储的索引
解说:数据文件和索引文件可以放在不同的目录下,需要在创建表的时候通过特定的语句DATA DIRECTORY和INDEX DIRECTORY来指定。
MyISAM类型的表可能会损坏影响访问,我们需要MyISAM类型的表提供的修复工具来修复,
1、CHECK TABLE 语句来检测表的健康状态
2、REPAIR TABLE语句来修复一个损坏的MyISAM表。
MyISAM类型的表支持的三种存储结构:
1、静态型
静态表是默认的存储格式,静态表中的字段都是非变长字段,例如CHAR等长度不可变的数据类型。
优点:存储速度快,表的性能比较高,容易缓存,出现故障容易恢复。
缺点:占用的空间比较大,因为在定义的时候是固定的,所以不管列中的值有多大,都会以最大值为准,占据了整个空间。
我们之前学过VARCHAR和CHAR的区别,在存取尾部带有空格字符的字符串的时候,我们取数据时VARCHAR取出来的字符串尾部带有空格(保留空格),而CHAR类型取出来的字符串尾部的空格字符则会被去掉。同样在这里也是,因为我们MyISAM的表在创建的时候如果是静态表存储格式,那么我们也要注意:如果需要保存的内容后面本来就带有空格,那么在返回的结果也会被去掉。
还要注意的是:静态表中的数据在存储时是按照列的宽度定义补足空格,但是在应用访问的时候并不会得到这些空格,这些空格在返回前已经被去掉了。此外静态表是MyISAM存储引擎默认的存储格式。
2、动态型
如果列(即使只有一列)定义为动态的数据类型,例如BLOB、TEXT、VARCHAR等变长数据类型。这时MyISAM就自动使用动态型表存储格式。
优点:占用的空间相对较少。
缺点:虽然动态型的表占用了比静态型表较少的空间,但带来了性能的降低,因为如果某个字段的内容发生改变则其位置很可能需要移动,这样就会导致碎片的产生。随着数据变化的怎多,碎片就会增加,数据访问性能就会相应的降低。
对于因为碎片的原因而降低数据访问性,有两种解决方法:
1、尽可能使用静态数据类型
2、定期执行OPTIMIZE TABLE语句或者myisamchk-r命令来改善性能。
3、压缩表
压缩表有myisampack工具创建,占据非常小的磁盘空间。
InnoDB存储引擎
优缺点
优点:支持事务,具有提交、回滚、崩溃恢复能力等。支持主键外键约束。支持并发量大,适用于大量的UPDATE、INSERT操作。
缺点:InnoDB写的处理效率差一点,并会占用更多的磁盘空间以保留数据和索引。不支持全文索引。大量的SELECT操作的查询速度不如MyISAM存储引擎。
InnoDB存储引擎的表的特点:
1、支持外键约束,详细参考之前的文章。
2、支持AUTO_INCREMENT,详细参考之前的文章。
存储方式
InnoDB存储表和索引有两种方式
1、使用共享表空间存储
这种方式创建的表的表结构保存在.frm文件中。
共享表空间存储 | 多表空间存储 |
创建的表的表结构保存在.frm文件中。 表存放在innodb_data_home_dir和innodb_data_file_path定义的表空间中。 |
创建的表的表结构仍然保存在.frm文件中。但是每个表的数据和索引又单独保存在.ibd文件中。 对于分区表,也有对应的.ibd文件,详细查阅资料。 |
注意:要使用多表空间的存储方式,需要设置参数“innodb_file_per_tale”。(如下所示说明存储引擎使用了多表空间的存储方式。)。并且还要重新启动服务后才能生效。
疑问处理:
1、对于使用多表空间存储的参数对新建的表的什么时候才会生效问题。
1、对于新建的表按照多表空间的方式创建,已有的表仍然使用共享表空间存储。
2、如果将已有的多表空间方式修改回共享表空间的方式,则新建表会在共享表空间中创建,但是已有的多表空间的表仍然保存原来的访问方式。
总结:多表空间的参数生效后,只对新建的表生效。
2、看了上面的理论知识,有人认为是否可以把.frm和.ibd的文件复制一下直接到别的数据库恢复一下呢?
不可以的,至于原因我们可以参考深入浅出mysql的第140页来查看。我们大多数情况下是将单表恢复到目标数据库,还是需要mysqldump和mysqlimport命令来实现。
3、是否在多表空间的存储方式下,共享表空间就不需要了呢?
不是的,即便在多表空间的存储方式下,共享表空间仍然是必须的。因为InnoDB要把内部数据词典和在线重做日志放在这个文件中。
MySQL的数据存放的目录下,在创建的数据库名字下有个.opt文件,有什么作用呢?
答:在某些库目录下有个db.opt文件,那这个文件是干什么用的呢?如果你用记事本txt等编辑器打开看的话,内容很简单,是用来记录该库的默认字符集编码和字符集排序规则用的。也就是说如果你创建数据库指定默认字符集和排序规则,那么后续创建的表如果没有指定字符集和排序规则,那么该新建的表将采用db.opt文件中指定的属性