• MySQL知识树存储引擎


    一.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不支持事务,也不支持外键,它的特点是访问速度快,如果表是以selectinsert为主,那么选择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表的自动增长列即便插入的数值是0null也不会影响到实际插入的值(实际插入的值为自动增长后的值)。

     

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

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

     

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

     

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

    2、外键约束

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

     

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

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

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

    3、存储方式

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

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

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

    MyISAM

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

    InnoDB

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

  • 相关阅读:
    第二章IntelliJ IDEA 安装目录的核心文件讲解
    第一章首次运行 IntelliJ IDEA 示例
    struts json ajax整理
    关于struts2文件下载
    mybatis深入资料
    MyBatis获取插入记录的自增长字段值
    好久没有更新博客了,今天更新了几篇
    枚举Enum 的常用方法
    angular js中ng-model时间格式化
    input框输入完回车即可查询事件
  • 原文地址:https://www.cnblogs.com/seker/p/5886952.html
Copyright © 2020-2023  润新知