看你的mysql现在已提供什么存储引擎: mysql> show engines; 看你的mysql当前默认的存储引擎: mysql> show variables like '%storage_engine%'; 你要看某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎):

mysql> show create table 表名;

 

 

 

我们知道MySQL最大的特色是其可插拔的插件式存储引擎,本文将介绍目前市面上主流的存储引擎。这里要特别提一点:由于MySQL是开源的,所以如果你对某些存储引擎不满意,可以修改或写一个存储引擎,增加自己想要的特性(据我所知,国内比较知名的有网易的TNT引擎),这也是MySQL作为开源数据库的魅力之一。

有些人刚接触MySQL的时候可能会有些惊讶,竟然有不支持事务的存储引擎,因为学过关系型数据库理论的人都知道,事务是关系型数据库的核心。但是在现实应用中(特别是互联网),为了提高性能,在某些场景下可以摈弃事务。

InnoDB

InnoDB是MySQL使用率最高的存储引擎,目前市面上至少95%的MySQL采用该存储引擎,因此从MySQL5.5开始,它替代MyISAM成为默认的存储引擎。它有如下几个特点:

1)支持事务:采用MVCC(多版本并发控制)来支持高并发,实现了四个ANSI标准的隔离级别,默认为Repeatable Read,并且通过间隙锁(next-key lock)防止幻读。

2)InnoDB的表是基于聚簇索引,对主键查询有很高的性能,但它的二级索引必须包含主键列。

3)支持热备份:Oracle提供的MySQL Enterprise Backup和Percona提供的开源的XtraBackup都可以实现热备

4)支持行级锁

MyISAM

1)不支持行级锁,也就是说任何操作都对整张表加锁。

2)不支持事务,无法回滚,崩溃后无法安全恢复。

3)支持全文索引、压缩、空间函数等

MyISAM设计简单,数据以紧密格式存储,在某些场景下性能很好,但 它最典型的问题还是表锁。

Archive

是一个针对高速插入和压缩做了优化的简单引擎,只支持insert和select操作,每次select都是全表扫描,适合日志和数据采集应用。

CSV

可以将普通的csv文件作为MySQL的表处理,可以将excel的数据存储为csv格式文件,然后复制到MySQL的数据目录下,就能在MySQL中以表的方式打开,因此CSV引擎作为一种数据交换机制,非常有用。

Memory

所有的数据都保持在内存中,重启后数据会丢失。Memory表是表级锁,因此写性能较低,但它的查询性能非常高,支持Hash索引。

NDB集群

MySQL服务器、NDB集群存储引擎,以及分布式的、share-nothing的、容灾的、高可用的NDB数据库组合成为MySQL集群。

 

以上介绍的都是MySQL内建的存储引擎,以下是第三方的存储引擎。

XtraDB、PBXT

是Percona公司基于InnoDB的一个改进版本

TokuDB

一种大数据的存储引擎。

RethinkDB

为固态存储SSD设计。

Infobright

面向列的存储引擎,为数据分析和数据仓库设计。

 

如何选择合适的存储引擎?

准则1:除非需要用到InnoDB没有的特性,否则都应该优先选择InnoDB引擎。

准则2:不要混合使用多种存储引擎。

 

改变表的存储引擎

有三种方法可以改变表的存储引擎,最常见的一种是:

alter table mytbl engine = InnoDB;

但这种方法有一个问题:需要执行很长时间,因为MySQL将按行把数据从原表复制到新表。

第2种方法是利用mysqldump工具将数据导出到文件,然后修改导出的文本文件中的create table语句的存储引擎选项。

最后一种方法是创建一个新的存储引擎的表,然后利用insert...select语句来导数据:

create table newtbl like oldtbl;  
alter table newtbl engine=innodb;  
insert into newtbl select * from oldtbl;