我们知道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;



更多相关文章

  1. MySql查询随机几条数据
  2. MySQL数据库笔记三:数据查询语言(DQL)与事务控制语言(TCL)
  3. 有没有一种方法可以在不破坏外键依赖关系的情况下将MySQL数据库
  4. mysql 先排序后分组再排序查询数据
  5. 数据库中的结果分页如何工作?
  6. MySQL-数据库安装及基本SQL语句
  7. MySQL SET,ENUM类型数据小结
  8. 从模型到控制器并返回到模型的数据
  9. mysql去除严格模式/插入数据库遇到重复保证唯一

随机推荐

  1. 绝对适合新手的php入门教程
  2. 怎么查看linux下php的安装目录?
  3. 新手必学的php基础知识
  4. php怎么删除图片?
  5. PHP之错误处理详解
  6. php中的可变变量(代码详解)
  7. php中mysql乱码怎么解决?
  8. PHP中一些常用操作类代码解析
  9. for和foreach哪个效率更高?为什么?
  10. php中的$是什么意思?