MySQL - 经常使用三种数据库存储引擎

数据库存储引擎:是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行建立、查询、更新和删除数据。不一样的存储引擎提供不一样的存储机制、索引技巧、锁定水平等功能,使用不一样的存储引擎,还能够得到特定的功能。如今许多不一样的数据库管理系统都支持多种不一样的数据引擎。MySQL的核心就是插件式存储引擎。数据库

 

查看存储引擎:缓存

咱们能够用SHOW ENGINES; 来查询数据库的存储引擎。安全

 

 

MySQL给用户提供了许多不一样的存储引擎。在MySQL中,不须要在整个服务器中使用同一种存储引擎,针对具体的要求,能够对每个表使用不一样的存储引擎。Support列的值表示某种引擎是否能使用:YES表示可使用、NO表示不能使用、DEFAULT表示该引擎为当前默认的存储引擎。服务器

 

咱们也能够经过使用命令来查看数据库默认使用的引擎:SHOW VARIABLES LIKE 'storage_engine';并发

 

 

下面来看一下其中几种经常使用的引擎。工具

 

l InnoDB存储引擎性能

 

InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),其它存储引擎都是非事务安全表,支持行锁定和外键,MySQL5.5之后默认使用InnoDB存储引擎。操作系统

 

InnoDB主要特性插件

为MySQL提供了具备提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级而且也在 SELECT语句中提供一个相似Oracle的非锁定读。这些功能增长了多用户部署和性能。在SQL查询中,能够自由地将InnoDB类型的表和其余MySQL的表类型混合起来,甚至在同一个查询中也能够混合。线程

 

InnoDB表的自动增加列能够手工插入,可是插入的若是是空或0,则实际插入到则是自动增加后到值。能够经过"ALTER TABLE...AUTO_INCREMENT=n;"语句强制设置自动增加值的起始值,默认为1,可是该强制到默认值是保存在内存中,数据库重启后该值将会丢失。可使用LAST_INSERT_ID()查询当前线程最后插入记录使用的值。若是一次插入多条记录,那么返回的是第一条记录使用的自动增加值。

对于InnoDB表,自动增加列必须是索引。若是是组合索引,也必须是组合索引的第一列,可是对于MyISAM表,自动增加列能够是组合索引的其余列,这样插入记录后,自动增加列是按照组合索引到前面几列排序后递增的。

 

MySQL支持外键的存储引擎只有InnoDB,在建立外键的时候,父表必须有对应的索引,子表在建立外键的时候也会自动建立对应的索引。在建立索引的时候,能够指定在删除、更新父表时,对子表进行的相应操做,包括restrict、cascade、set null和no action。其中restrict和no action相同,是指限制在子表有关联的状况下,父表不能更新;casecade表示父表在更新或删除时,更新或者删除子表对应的记录;set null 则表示父表在更新或者删除的时候,子表对应的字段被set null。

当某个表被其它表建立了外键参照,那么该表对应的索引或主键被禁止删除。

可使用set foreign_key_checks=0;临时关闭外键约束,setforeign_key_checks=1;打开约束。

 

InnoDB存储引擎为在主内存中缓存数据和索引而维持它本身的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间能够包含数个文件(或原始磁盘文件)。这与MyISAM表不一样,好比在MyISAM表中每一个表被存放在分离的文件中。InnoDB表能够是任何尺寸,即便在文件尺寸被限制为2GB的操做系统上。

InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,若是没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此做为主键。

使用 InnoDB存储引擎 MySQL将在数据目录下建立一个名为 ibdata1的10MB大小的自动扩展数据文件,以及两个名为 ib_logfile0和 ib_logfile1的5MB大小的日志文件

 

l MyISAM存储引擎

 

MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其余应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务,不支持外键。

 

MyISAM主要特性:

 

被大文件系统和操做系统支持。

当把删除和更新及插入操做混合使用的时候,动态尺寸的行产生更少碎片。这要经过合并相邻被删除的块,若下一个块被删除,就扩展到下一块自动完成。

每一个MyISAM表最大索引数是64,这能够经过从新编译来改变。每一个索引最大的列数是16。

最大的键长度是1000字节,这也能够经过编译来改变,对于键长度超过250字节的状况,一个超过1024字节的键将被用上。

BLOB和TEXT列能够被索引。

NULL被容许在索引的列中,这个值占每一个键的0~1个字节。

全部数字键值以高字节优先被存储以容许一个更高的索引压缩。

每一个MyISAM类型的表都有一个AUTOINCREMENT的内部列,当INSERT和UPDATE操做的时候该列被更新,同时AUTOINCREMENT列将被刷新。因此说,MyISAM类型表的AUTOINCREMENT列更新比InnoDB类型的AUTOINCREMENT更快。

数据文件和索引文件能够放置在不一样的目录,平均分配IO,获取更快的速度。要指定数据文件和索引文件的路径,须要在建立表的时候经过DATA DIRECTORY和INDEX DIRECTORY语句指定,文件路径须要使用绝对路径。

每一个MyISAM表都有一个标志,服务器或myisamchk程序在检查MyISAM数据表时会对这个标志进行设置。MyISAM表还有一个标志用来代表该数据表在上次使用后是否是被正常的关闭了。若是服务器觉得当机或崩溃,这个标志能够用来判断数据表是否须要检查和修复。若是想让这种检查自动进行,能够在启动服务器时使用--myisam-recover现象。这会让服务器在每次打开一个MyISAM数据表是自动检查数据表的标志并进行必要的修复处理。MyISAM类型的表可能会损坏,可使用CHECK TABLE语句来检查MyISAM表的健康,并用REPAIR TABLE语句修复一个损坏到MyISAM表。

每一个字符列能够有不一样的字符集。

有VARCHAR的表能够固定或动态记录长度。

VARCHAR和CHAR列能够多达64KB。

使用MyISAM引擎建立数据库,将产生3个文件。文件的名字以表名字开始,扩展名之处文件类型:frm文件存储表定义、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名时.MYI(MYIndex)。

 

MyISAM的表支持3种不一样的存储格式:静态(固定长度)表,动态表,压缩表

 

 静态表是默认的存储格式。静态表中的字段都是非变长字段,这样每一个记录都是固定长度的,这种存储方式的优势是存储很是迅速,容易缓存,出现故障容易恢复;缺点是占用的空间一般比动态表多。静态表在数据存储时会根据列定义的宽度定义补足空格,可是在访问的时候并不会获得这些空格,这些空格在返回给应用以前已经去掉。同时须要注意:在某些状况下可能须要返回字段后的空格,而使用这种格式时后面到空格会被自动处理掉。

动态表包含变长字段,记录不是固定长度的,这样存储的优势是占用空间较少,可是频繁到更新删除记录会产生碎片,须要按期执行OPTIMIZE TABLE语句或myisamchk -r命令来改善性能,而且出现故障的时候恢复相对比较困难。

压缩表由myisamchk工具建立,占据很是小的空间,由于每条记录都是被单独压缩的,因此只有很是小的访问开支。

 

l MEMORY存储引擎

 

MEMORY存储引擎将表中的数据存储到内存中,为查询和引用其余表数据提供快速访问。

 

MEMORY主要特性:

MEMORY表的每一个表能够有多达32个索引,每一个索引16列,以及500字节的最大键长度。

能够在一个MEMORY表中有非惟一键值。

MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引。

MEMORY表在所由客户端之间共享(就像其余任何非TEMPORARY表)。

MEMORY表内存被存储在内存中,内存是MEMORY表和服务器在查询处理时的空闲中,建立的内部表共享。

默认状况下,MEMORY数据表使用散列索引,利用这种索引进行“相等比较”很是快,可是对“范围比较”的速度就慢多了。所以,散列索引值适合使用在"="和"<=>"的操做符中,不适合使用在"<"或">"操做符中,也一样不适合用在order by字句里。若是确实要使用"<"或">"或betwen操做符,可使用btree索引来加快速度。

存储在MEMORY数据表里的数据行使用的是固定长度的格式,所以加快处理速度,这意味着不能使用BLOB和TEXT这样的长度可变的数据类型。VARCHAR是一种长度可变的类型,但由于它在MySQL内部看成长度固定不变的CHAR类型,因此也可使用。

 

create table tab_memoryengine=memory select id,name,age,addr from man order by id;

 

使用USING HASH/BTREE来指定特定到索引。

create index mem_hash using hashon tab_memory(city_id);

 

在启动MySQL服务的时候使用--init-file选项,把insert into...select或load data infile 这样的语句放入到这个文件中,就能够在服务启动时从持久稳固的数据源中装载表。

每一个MEMORY表中放置到数据量的大小,受到max_heap_table_size系统变量的约束,这个系统变量的初始值是16M,同时在建立MEMORY表时可使用MAX_ROWS子句来指定表中的最大行数。

每一个MEMORY表实际对应一个磁盘文件,格式是.frm。MEMORY类型的表访问很是快,由于它到数据是放在内存中的,而且默认使用HASH索引,可是一旦服务器关闭,表中的数据就会丢失,但表还会继续存在。 服务器须要足够的内存来维持所在的在同一时间使用的MEMORY表,当再也不须要MEMORY表的内容时,要释放被MEMORY表使用的内存,应该执行 DELETE FROM或 TRUNCATE TABLE,或者删除整个表(使用DROP TABLE)。

 

l 存储引擎的选择

 

在实际工做中,选择一个合适的存储引擎是一个比较复杂的问题。每种存储引擎都有本身的优缺点,不能笼统地说谁比谁好。

 

存储引擎的对比

特性

InnoDB

MyISAM

MEMORY

事务安全

支持

存储限制

64TB

空间使用

内存使用

插入数据的速度

对外键的支持

支持

 

 

InnoDB: 支持事务处理,支持外键,支持崩溃修复能力和并发控制。若是须要对事务的完整性要求比较高(好比银行),要求实现并发控制(好比售票),那选择InnoDB有很大的优点。若是须要频繁的更新、删除操做的数据库,也能够选择InnoDB,由于支持事务的提交(commit)和回滚(rollback)。

 

MyISAM: 插入数据快,空间和内存使用比较低。若是表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。若是应用的完整性、并发性要求比较低,也可使用。

 

MEMORY: 全部的数据都在内存中,数据的处理速度快,可是安全性不高。若是须要很快的读写速度,对数据的安全性要求较低,能够选择MEMOEY。它对表的大小有要求,不能创建太大的表。因此,这类数据库只使用在相对较小的数据库表。

 

同一个数据库也可使用多种存储引擎的表。若是一个表要求比较高的事务处理,能够选择InnoDB。这个数据库中能够将查询要求比较高的表选择MyISAM存储。若是该数据库须要一个用于查询的临时表,能够选择MEMORY存储引擎。

 

若要修改默认引擎,能够修改配置文件中的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关键字在建立或修改数据库时指定所使用到引擎。

在建立表的时候经过engine=...或type=...来指定所要使用的引擎。show table status from DBname来查看指定表的引擎。

相关文章
相关标签/搜索