MySQL存储引擎(Storage Engine)

1. 什么是存储引擎

MySQL的数据,是由Storage Engine来管理的。下面是MySQL的系统结构图,Storage Engine是MySQL中的一个模块,从中可以出Storage Engine在MySQL中的地位。

MySQL存储引擎(Storage Engine)

MySQL的Storage Engine是可插拔的,它处于SQL解释器和文件系统层之间。数据库里的原始数据都是存储在文件系统(磁盘)上的,当我们执行一个SELECT语句时,Storage Engine就会将磁盘上的数据读入内存,为这些数据创建额外的B-Tree结构(索引,index),并根据索引来查找数据。Storage Engine的存在,能解决并发访问等问题,也能提高数据增删改查、数据压缩存储的效率。

2. MySQL常用存储引擎,如何选型

在MySQL中使用“show engines”命令,能看到MySQL常用的Storage Engine有“InnoDB”,“MEMORY”,“MyISAM”等。缺省用“InnoDB”。 MySQL中每个表都能设置自己的Storage Engine。

不同的Storage Engine,对数据的组织方式不一样,下表简单列举了他们的区别[2]。
MySQL存储引擎(Storage Engine)

从表中,也能明白Storage Engine的主要功能了。

文章[3]中提到了如何选择Storage Engine(每个表都能选择自己的Storage Engine)。
(1)MyISAM:选择密集型(筛选大量数据时非常迅速)、插入密集型的表(管理邮件或Web服务器日志数据);
(2)MEMORY:数据量小,且被频繁访问;
(3)InnoDB:需要事务支持,并且有较高的并发读取频率。

通过SQL语句,可以在创建表时为表指定Storage Engine,也能更改已存在表的Storage Engine。

CREATE TABLE tablename(
id INT
) ENGINE = MyISAM;

ALTER TABLE tablename ENGINE = MyISAM;

查看表的Storage Engine:
SHOW TABLE STATUS WHERE NAME = ‘tablename’;

3. 索引是何时被创建出来的,怎么样子的(如何用SQL查看)

索引(index)是Storage Engine的一个核心功能。index主要用于提高数据查询效率。

查看表中已存在的index:
SHOW INDEX FROM mydb.mytable;

创建index
alter table tablename add index index_name (column_list)

删除已经存在的index
alter table table_name drop index index_name

4. 参考:

  1. 插件式儲存引擎體系結構,http://twpug.net/docs/mysql-5.1/pluggable-storage.html
  2. https://dev.mysql.com/doc/refman/5.5/en/storage-engines.html
  3. http://www.jellythink.com/archives/640
  4. http://www.cnblogs.com/IT-Monkey/p/3293131.html
  5. B+Tree index structures in InnoDB, http://blog.jcole.us/2013/01/10/btree-index-structures-in-innodb/