一.MySQL存储引擎概述
MySQL5.5版本之前默认的存储引擎是MyISAM,而在5.5及以后的版本默认的存储引擎修改为InnoDB
查看当前MySQL的默认存储引擎的命令是:show variables like ‘table_type’;
想知道当前MySQL版本支持哪些存储引擎则可通过以下两个命令实现
①show engines \G
\G是对展示的内容作了格式化,若不使用\G,则展示出来的效果是如下的样子
可以看到加\G的展示方式像是文本文件,而不加\G的展示方式像是表格文件。
②show variables like ‘have_%’;
Value值为DISABLED表示该属性被支持,但在数据库启动时被禁用,需要手动启用。
如果要修改一个表的存储引擎,要怎么做呢,首先我们应该查看这个表的存储引擎是否是我们所需要的,使用show create table table_name \G命令来查看表的创建信息,其中table_name就是指要查看的相关表。
若要将t_a表的存储引擎修改为MyISAM,则可以使用alter table table_name engine=MyISAM;命令来操作
执行完上述命令后再使用show create table table_name \G就可以看到该表的存储已经发生了改变
二.各种存储引擎的特性
MyISAM存储引擎
MyISAM不支持事务,也不支持外键,它的特点是访问速度快,如果表是以select和insert为主,那么选择MyISAM是比较合适的,例如字典表的数据变动频率很小,使用场景也基本以select为主,所以字典表是很适合MyISAM的。
MyISAM的表支持三种存储格式;静态表、动态表、压缩表
静态表是默认的存储格式,静态表中的字段都是固定长度的,这样存储很迅速但占用的空间要多于动态表,这是因为当存储的数据没有达到字段的定义长度时,会补足空格,但这不会影响到应用程序对数据的访问,因为在将结果返回给应用程序之前这些空格就被去掉了。
补足的空格是加在原数据之后的,所以只需要将数据后的空格都去掉返回给应用程序,就能够保证数据查询的准确性。若原数据后本身就带有空格,会发生什么呢?静态表就将这些空格去掉后再进行存储。
row_format是用来指定MyISAM的表所使用的存储格式,fixed是静态表,dynamic是动态表,compressed压缩表,这里指定为静态表
插入多条数据
可以看到第二条数据原本的值为’abced ’,第四条数据原本的值为’ abced ‘,在插入表中后,原数据后的空格都被去掉了,因为若存储的数据后原本就带有空格,则应该使用MyISAM的表的dynamic存储格式,这点要注意,不然会莫名其妙发现数据变动了。
动态表相对于静态表来说,其字段都是变长的,存储所占用的空间相对较少,但频繁的更新和删除会导致产生碎片,需要定期执行optimize table table_name;来进行优化。
压缩表需要使用myisampack工具来创建,由于每条记录都被单独压缩,所以占用的磁盘空间非常小,因此访问所造成的开支也非常小。
InnoDB存储引擎
使用InnoDB存储引擎的表具备了事务安全,事务安全体现在提交、回滚、崩溃恢复能力上。
1、自动增长列
当在定义自动增长列时,该列必须被指定为一个键,可以为主键、复合主键、联合主键,不然在不指定键的情况下将一个列设置为自动增长,在尝试创建表时MySQL会报“Incorrect table definition(不正确的表定义)”
InnoDB表的自动增长列即便插入的数值是0或null也不会影响到实际插入的值(实际插入的值为自动增长后的值)。
可以看到在插入id为1的数据后,接着插入了id为10的数据,再后面插入的数据的自动增长列的值就从11开始了。因此对自动增长列如果通过间隔值的形式插入,那么自动增长列的值就是该列最大值加1。
alter table table_name auto_increment=1;可以强制设置自动增长列的初始值,默认是从1开始的,强制设置后的值就保存在内存中,若该值在被使用之前数据库被重启,则强制设置的值会丢失,而在不重新设置的情况下,自动增长列的值就是该列最大值加1。
将表的自动增长列的值强制设置为15,再插入数据可以看到15被使用了
接着将自动增长列的值强制设置为20,但这个时候多做了一步操作就是重启了数据库服务,可以看到在执行新的insert语句时,提示信息显示:“MySQL服务消失,无连接,尝试重新连接...”,当重新连接服务后可以看到,新insert语句的自动增长列值为16,而不是20,因此这一情况就证实了之前描述的场景。
2、外键约束
MySQL中唯一支持外键的存储引擎就是InnoDB,在创建外键约束时,可以指定在删除、更新父表时,对子表进行相应的操作。这些操作包括restrict、cascade、set null、no action,restrict和no action的作用相同,都是限制在子表有关联记录的情况下父表不能进行删除、更新。cascade表示父表在进行删除、更新操作时,删除、更新子表关联的记录。set null表示父表进行删除、更新时,将子表关联字段设置为null
例如我们在创建city表时,对其country_id字段设置了外键约束,约束为父表进行更新时子表关联记录也做更新,父表进行删除时若子表有关联记录则父表不能进行删除
以上是对父表记录进行删除时MySQL给出的错误提示
在导入多表的数据时,如果需要忽略表之间的导入顺序,可以在导入数据时将外键检查关闭,命令为“set foreign_key_checks=0;”
3、存储方式
InnoDB存储引擎存储表和索引有以下两种方式
第一种是使用共享表空间存储,第二种是使用多表空间存储,两者的主要区别是前者的数据和索引通过两个参数(innodb_data_home_dir和innodb_data_file_path)保存在定义的表空间中,后者的数据和索引单独保存在.ibd文件中
三、不同存储引擎的适用环境
MyISAM
如果应用以读和写为主,仅涉及到少量的更新和删除,且对事务完整性、并发性要求不高则可以选用
InnoDB
如果应用有较多的更新和删除,且对事务完整性、并发性要求较高则可以选用