【个人学习】 - 概述 - 存储引擎介绍
开始接触存储引擎的时候,对存储引擎的概念非常模糊,查了很多资料,说的也是模棱两可,感觉云里雾里的,随着深入学习以及踏过一些坑之后,多多少少对存储引擎有些概念。所谓的存储引擎,说的高大上一点,就是一些策略,何为策略,就是维护表,数据之间的关系,联系的方法以及解决数据读取,存储等高效率的方案。说白了,就是解决方法,只是针对mysql的方法。
mysql 5.0之后支持的存储引擎包括MyISAM、InnoDB、MEMORY、MERGE等,这里列出的是常用的几种,其中InnoDB是mysql默认的存储引擎,也是最常用的存储引擎。
在创建表的时候可以选择存储引擎:如
Create table test( ID char(32) not null auto_increment, Name varchar(32) )engine=InnoDB default charset = utf8;可以使用sql查看当前版本的mysql支持哪些存储引擎: 方法1: show engines; 方法2: show variables like 'have%'; 也可以使用sql查看当前数据库默认的存储引擎: show variables like 'table_type';
MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器;每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,文件名就是表名。例如,我建立了一个MyISAM引擎的tb_Demo表,那么就会生成以下三个文件: 1. tb_demo.frm,存储表定义; 2. tb_demo.MYD,存储数据; 3. tb_demo.MYI,存储索引。
缺点 不支持事物,不支持外键,由此存储引擎创建的表有可能损坏优点 访问速度快,select,insert速度快;筛选大量数据时非常迅速,并发插入特性允许同时选择和插入数据。使用场景 如果对事物完整性没有要求,或者以select,insert为主的应用基本可以使用由于MyISAM类型的表存在损坏的可能,可以用check table tableName检查表是否损坏,可以使用repair table tableName修复表。InnoDB是一个健壮的事务型存储引擎,这种存储引擎已经被很多互联网公司使用,为用户操作非常大的数据存储提供了一个强大的解决方案。 1. 缺点 对比MyISAM,写的效率差一点,占用更多的磁盘空间以保留数据和索引。 2. 优点 支持提交,回滚和崩溃恢复能力的事务安全,支持外键约束(只有InnoDB存储引擎支持。)。 3. 自动增长列,插入空或0,实际值将会插入自动增长后的值。InnoDB表,自动增长列,必须是索引,组合索引,必须是第一列。如: Create table test( ID char(32) not null auto_increment,-- 自动增长列 Name varchar(32) )engine=InnoDB default charset = utf8; ALTER TABLE test auto_increment = 1; -- 自动增长列从1开始。 select last_insert_id();-- 查看最后一次插入自动增长列的值。 4. 创建索引是可以指定删除或更新父表时对子表进行相应的操作,包括:RESTRICT,CASCADE,SET NULL,NO ACTION.其中RESTRICT和NO ACTION相同,指限制在字表有关联记录的情况下不能更新父表。CASCADE指父表更新或者删除的时候,字表更新或者删除相应记录,SET NULL指父表更新或者删除的时候,字表对应字段设置为空,CASCADE,SET NULL谨慎使用,可能会造成数据丢失。 5. 关闭外键约束命令:SET FOREIGN KEY CHECKS=0; 开启外键约束命令:SET FOREIGN KEY CHECKS=1; 6. 查看外键信息命令:SHOW CREATE TABLE或者SHOW TABLE STATUS 7. 存储方式: 1:共享表空间存储 2:使用多表空间存储,使用多表空间存储,需要设置参数:innodb_file_per_table,重启服务器生效。 8. 应用场景 InnoDB还引入了行级锁定和外键约束,在以下场合下,使用InnoDB是最理想的选择
更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。外键约束。MySQL支持外键的存储引擎只有InnoDB。支持自动增加列AUTO_INCREMENT属性。使用MEMORY存储引擎的出发点是速度。为得到最快的响应时间,采用的逻辑存储介质是系统内存。虽然在内存中存储表数据确实会提供很高的性能,但当mysqld守护进程崩溃时,所有的Memory数据都会丢失。获得速度的同时也带来了一些缺陷。它要求存储在Memory数据表里的数据使用的是长度不变的格式,这意味着不能使用BLOB和TEXT这样的长度可变的数据类型,VARCHAR是一种长度可变的类型,但因为它在MySQL内部当做长度固定不变的CHAR类型,所以可以使用。
缺点:一旦服务器关闭,数据会丢失掉,牺牲内存以及安全性换取速度。优点:MEMORY类型的表访问速度非常的快,因为他的数据是放在内存中的,并且默认使用HASH索引,还有另外一种所索引BTREE。创建memory表。create table tab_memory ENGINE=memory;查看表信息:show table status like ‘tab_memory’;创建指定索引格式: Create index mem_hash USING HASH on tab_memory;查看索引信息:Show index from tab_memory;这是在工作中遇到的一点问题以及业余时间学习的一点东西,写下来,留着备用。仅供学习,参考,如有错误,敬请见谅。