mysql中常见的数据库引擎之间的比较 mysql
转载自 深刻浅出mysql数据库
MySQL5.5之后默认使用InnoDB存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表。
若要修改默认引擎,能够修改配置文件中的default-storage-engine。能够经过:show variables like ‘default_storage_engine’;查看当前数据库到默认引擎。命令:show engines和show variables like ‘have%’能够列出当前数据库所支持到引擎。其中Value显示为disabled的记录表示数据库支持此引擎,而在数据库启动时被禁用。在MySQL5.1之后,INFORMATION_SCHEMA数据库中存在一个ENGINES的表,它提供的信息与show engines;语句彻底同样,可使用下面语句来查询哪些存储引擎支持事物处理:select engine from information_chema.engines where transactions = ‘yes’;
能够经过engine关键字在建立或修改数据库时指定所使用到引擎。
主要存储引擎:MyISAM、InnoDB、MEMORY和MERGE介绍:
在建立表到时候经过engine=…或type=…来指定所要使用到引擎。show table status from DBname来查看指定表到引擎。sql
MyISAM
它不支持事务,也不支持外键,尤为是访问速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用基本均可以使用这个引擎来建立表。
每一个MyISAM在磁盘上存储成3个文件,其中文件名和表名都相同,可是扩展名分别为: 数据库
数据文件和索引文件能够放置在不一样的目录,平均分配IO,获取更快的速度。要指定数据文件和索引文件的路径,须要在建立表的时候经过DATA DIRECTORY和INDEX DIRECTORY语句指定,文件路径须要使用绝对路径。
每一个MyISAM表都有一个标志,服务器或myisamchk程序在检查MyISAM数据表时会对这个标志进行设置。MyISAM表还有一个标志用来代表该数据表在上次使用后是否是被正常的关闭了。若是服务器觉得当机或崩溃,这个标志能够用来判断数据表是否须要检查和修复。若是想让这种检查自动进行,能够在启动服务器时使用–myisam-recover现象。这会让服务器在每次打开一个MyISAM数据表是自动检查数据表的标志并进行必要的修复处理。MyISAM类型的表可能会损坏,可使用CHECK TABLE语句来检查MyISAM表的健康,并用REPAIR TABLE语句修复一个损坏到MyISAM表。
MyISAM的表还支持3种不一样的存储格式: 缓存
其中静态表是默认的存储格式。静态表中的字段都是非变长字段,这样每一个记录都是固定长度的,这种存储方式的优势是存储很是迅速,容易缓存,出现故障容易恢复;缺点是占用的空间一般比动态表多。静态表在数据存储时会根据列定义的宽度定义补足空格,可是在访问的时候并不会获得这些空格,这些空格在返回给应用以前已经去掉。同时须要注意:在某些状况下可能须要返回字段后的空格,而使用这种格式时后面到空格会被自动处理掉。
动态表包含变长字段,记录不是固定长度的,这样存储的优势是占用空间较少,可是频繁到更新删除记录会产生碎片,须要按期执行OPTIMIZE TABLE语句或myisamchk -r命令来改善性能,而且出现故障的时候恢复相对比较困难。
压缩表由myisamchk工具建立,占据很是小的空间,由于每条记录都是被单独压缩的,因此只有很是小的访问开支。安全
InnoDB
InnoDB存储引擎提供了具备提交、回滚和崩溃恢复能力的事务安全。可是对比MyISAM的存储引擎,InnoDB写的处理效率差一些而且会占用更多的磁盘空间以保留数据和索引。服务器
1)自动增加列:
InnoDB表的自动增加列能够手工插入,可是插入的若是是空或0,则实际插入到则是自动增加后到值。能够经过”ALTER TABLE…AUTO_INCREMENT=n;”语句强制设置自动增加值的起始值,默认为1,可是该强制到默认值是保存在内存中,数据库重启后该值将会丢失。可使用LAST_INSERT_ID()查询当前线程最后插入记录使用的值。若是一次插入多条记录,那么返回的是第一条记录使用的自动增加值。
对于InnoDB表,自动增加列必须是索引。若是是组合索引,也必须是组合索引的第一列,可是对于MyISAM表,自动增加列能够是组合索引的其余列,这样插入记录后,自动增加列是按照组合索引到前面几列排序后递增的。工具
2)外键约束:
MySQL支持外键的存储引擎只有InnoDB,在建立外键的时候,父表必须有对应的索引,子表在建立外键的时候也会自动建立对应的索引。
在建立索引的时候,能够指定在删除、更新父表时,对子表进行的相应操做,包括restrict、cascade、set null和no action。其中restrict和no action相同,是指限制在子表有关联的状况下,父表不能更新;casecade表示父表在更新或删除时,更新或者删除子表对应的记录;set null 则表示父表在更新或者删除的时候,子表对应的字段被set null。
当某个表被其它表建立了外键参照,那么该表对应的索引或主键被禁止删除。
可使用set foreign_key_checks=0;临时关闭外键约束,set foreign_key_checks=1;打开约束。性能
MEMORY
memory使用存在内存中的内容来建立表。每一个MEMORY表实际对应一个磁盘文件,格式是.frm。MEMORY类型的表访问很是快,由于它到数据是放在内存中的,而且默认使用HASH索引,可是一旦服务器关闭,表中的数据就会丢失,但表还会继续存在。
默认状况下,memory数据表使用散列索引,利用这种索引进行“相等比较”很是快,可是对“范围比较”的速度就慢多了。所以,散列索引值适合使用在”=”和”<=>”的操做符中,不适合使用在”<”或”>”操做符中,也一样不适合用在order by字句里。若是确实要使用”<”或”>”或betwen操做符,可使用btree索引来加快速度。
存储在MEMORY数据表里的数据行使用的是长度不变的格式,所以加快处理速度,这意味着不能使用BLOB和TEXT这样的长度可变的数据类型。VARCHAR是一种长度可变的类型,但由于它在MySQL内部看成长度固定不变的CHAR类型,因此可使用。spa
create table tab_memory engine=memory select id,name,age,addr from man order by id;
使用USING HASH/BTREE来指定特定到索引。 线程
create index mem_hash using hash on tab_memory(city_id);
在启动MySQL服务的时候使用–init-file选项,把insert into…select或load data infile 这样的语句放入到这个文件中,就能够在服务启动时从持久稳固的数据源中装载表。
服务器须要足够的内存来维持所在的在同一时间使用的MEMORY表,当再也不使用MEMORY表时,要释放MEMORY表所占用的内存,应该执行DELETE FROM或truncate table或者删除整个表。
每一个MEMORY表中放置到数据量的大小,受到max_heap_table_size系统变量的约束,这个系统变量的初始值是16M,同时在建立MEMORY表时可使用MAX_ROWS子句来指定表中的最大行数。
MERGE
merge存储引擎是一组MyISAM表的组合,这些MyISAM表结构必须彻底相同,MERGE表中并无数据,对MERGE类型的表能够进行查询、更新、删除的操做,这些操做其实是对内部的MyISAM表进行操做。对于对MERGE表进行的插入操做,是根据INSERT_METHOD子句定义的插入的表,能够有3个不一样的值,first和last值使得插入操做被相应的做用在第一个或最后一个表上,不定义这个子句或者为NO,表示不能对这个MERGE表进行插入操做。能够对MERGE表进行drop操做,这个操做只是删除MERGE表的定义,对内部的表没有任何影响。MERGE在磁盘上保留2个以MERGE表名开头文件:.frm文件存储表的定义;.MRG文件包含组合表的信息,包括MERGE表由哪些表组成,插入数据时的依据。能够经过修改.MRG文件来修改MERGE表,可是修改后要经过flush table刷新。
create table man_all(id int,name varchar(20))engine=merge union=(man1,man2) insert_methos=last;