一.MySQL存储引擎概述

MySQL5.5版本之前默认的存储引擎是MyISAM,而在5.5及以后的版本默认的存储引擎修改为InnoDB

查看当前MySQL的默认存储引擎的命令是:show variables like ‘table_type’;

 

mysql 查看表的存储引擎 mysql查看存储引擎指令_MySQL

想知道当前MySQL版本支持哪些存储引擎则可通过以下两个命令实现

①show engines \G

 

mysql 查看表的存储引擎 mysql查看存储引擎指令_mysql 查看表的存储引擎_02

\G是对展示的内容作了格式化,若不使用\G,则展示出来的效果是如下的样子

 

mysql 查看表的存储引擎 mysql查看存储引擎指令_MySQL_03

可以看到加\G的展示方式像是文本文件,而不加\G的展示方式像是表格文件。

②show variables like ‘have_%’;

 

mysql 查看表的存储引擎 mysql查看存储引擎指令_数据_04

Value值为DISABLED表示该属性被支持,但在数据库启动时被禁用,需要手动启用。

如果要修改一个表的存储引擎,要怎么做呢,首先我们应该查看这个表的存储引擎是否是我们所需要的,使用show create table table_name \G命令来查看表的创建信息,其中table_name就是指要查看的相关表。

 

mysql 查看表的存储引擎 mysql查看存储引擎指令_mysql 查看表的存储引擎_05

若要将t_a表的存储引擎修改为MyISAM,则可以使用alter table table_name engine=MyISAM;命令来操作

 

mysql 查看表的存储引擎 mysql查看存储引擎指令_MySQL_06

执行完上述命令后再使用show create table table_name \G就可以看到该表的存储已经发生了改变

 

二.各种存储引擎的特性

MyISAM存储引擎

MyISAM不支持事务,也不支持外键,它的特点是访问速度快,如果表是以select和insert为主,那么选择MyISAM是比较合适的,例如字典表的数据变动频率很小,使用场景也基本以select为主,所以字典表是很适合MyISAM的。

MyISAM的表支持三种存储格式;静态表、动态表、压缩表

静态表是默认的存储格式,静态表中的字段都是固定长度的,这样存储很迅速但占用的空间要多于动态表,这是因为当存储的数据没有达到字段的定义长度时,会补足空格,但这不会影响到应用程序对数据的访问,因为在将结果返回给应用程序之前这些空格就被去掉了。

补足的空格是加在原数据之后的,所以只需要将数据后的空格都去掉返回给应用程序,就能够保证数据查询的准确性。若原数据后本身就带有空格,会发生什么呢?静态表就将这些空格去掉后再进行存储。

 

mysql 查看表的存储引擎 mysql查看存储引擎指令_数据_07

row_format是用来指定MyISAM的表所使用的存储格式,fixed是静态表,dynamic是动态表,compressed压缩表,这里指定为静态表

 

mysql 查看表的存储引擎 mysql查看存储引擎指令_存储引擎_08

插入多条数据

 

mysql 查看表的存储引擎 mysql查看存储引擎指令_MySQL_09

可以看到第二条数据原本的值为’abced ’,第四条数据原本的值为’  abced ‘,在插入表中后,原数据后的空格都被去掉了,因为若存储的数据后原本就带有空格,则应该使用MyISAM的表的dynamic存储格式,这点要注意,不然会莫名其妙发现数据变动了。

 

动态表相对于静态表来说,其字段都是变长的,存储所占用的空间相对较少,但频繁的更新和删除会导致产生碎片,需要定期执行optimize table table_name;来进行优化。

 

mysql 查看表的存储引擎 mysql查看存储引擎指令_mysql 查看表的存储引擎_10

压缩表需要使用myisampack工具来创建,由于每条记录都被单独压缩,所以占用的磁盘空间非常小,因此访问所造成的开支也非常小。

 

InnoDB存储引擎

使用InnoDB存储引擎的表具备了事务安全,事务安全体现在提交、回滚、崩溃恢复能力上。

1、自动增长列

当在定义自动增长列时,该列必须被指定为一个键,可以为主键、复合主键、联合主键,不然在不指定键的情况下将一个列设置为自动增长,在尝试创建表时MySQL会报“Incorrect table definition(不正确的表定义)”

 

mysql 查看表的存储引擎 mysql查看存储引擎指令_数据_11

InnoDB表的自动增长列即便插入的数值是0或null也不会影响到实际插入的值(实际插入的值为自动增长后的值)。

 

mysql 查看表的存储引擎 mysql查看存储引擎指令_mysql 查看表的存储引擎_12

mysql 查看表的存储引擎 mysql查看存储引擎指令_存储引擎_13

mysql 查看表的存储引擎 mysql查看存储引擎指令_mysql 查看表的存储引擎_14

可以看到在插入id为1的数据后,接着插入了id为10的数据,再后面插入的数据的自动增长列的值就从11开始了。因此对自动增长列如果通过间隔值的形式插入,那么自动增长列的值就是该列最大值加1。

 

alter table table_name auto_increment=1;可以强制设置自动增长列的初始值,默认是从1开始的,强制设置后的值就保存在内存中,若该值在被使用之前数据库被重启,则强制设置的值会丢失,而在不重新设置的情况下,自动增长列的值就是该列最大值加1。

 

mysql 查看表的存储引擎 mysql查看存储引擎指令_mysql 查看表的存储引擎_15

将表的自动增长列的值强制设置为15,再插入数据可以看到15被使用了

 

mysql 查看表的存储引擎 mysql查看存储引擎指令_数据_16

接着将自动增长列的值强制设置为20,但这个时候多做了一步操作就是重启了数据库服务,可以看到在执行新的insert语句时,提示信息显示:“MySQL服务消失,无连接,尝试重新连接...”,当重新连接服务后可以看到,新insert语句的自动增长列值为16,而不是20,因此这一情况就证实了之前描述的场景。

 

2、外键约束

MySQL中唯一支持外键的存储引擎就是InnoDB,在创建外键约束时,可以指定在删除、更新父表时,对子表进行相应的操作。这些操作包括restrict、cascade、set null、no action,restrict和no action的作用相同,都是限制在子表有关联记录的情况下父表不能进行删除、更新。cascade表示父表在进行删除、更新操作时,删除、更新子表关联的记录。set null表示父表进行删除、更新时,将子表关联字段设置为null

 

mysql 查看表的存储引擎 mysql查看存储引擎指令_MySQL_17

例如我们在创建city表时,对其country_id字段设置了外键约束,约束为父表进行更新时子表关联记录也做更新,父表进行删除时若子表有关联记录则父表不能进行删除

mysql 查看表的存储引擎 mysql查看存储引擎指令_MySQL_18

以上是对父表记录进行删除时MySQL给出的错误提示

 

在导入多表的数据时,如果需要忽略表之间的导入顺序,可以在导入数据时将外键检查关闭,命令为“set foreign_key_checks=0;”

 

3、存储方式

InnoDB存储引擎存储表和索引有以下两种方式

第一种是使用共享表空间存储,第二种是使用多表空间存储,两者的主要区别是前者的数据和索引通过两个参数(innodb_data_home_dir和innodb_data_file_path)保存在定义的表空间中,后者的数据和索引单独保存在.ibd文件中

 

 

三、不同存储引擎的适用环境

MyISAM

如果应用以读和写为主,仅涉及到少量的更新和删除,且对事务完整性、并发性要求不高则可以选用

InnoDB

如果应用有较多的更新和删除,且对事务完整性、并发性要求较高则可以选用