官网:https://dev.mysql.com/doc/refman/5.6/en/storage-engines.html
html
Table 16.1 Storage Engines Feature Summary mysql
Feature | MyISAM | Memory | InnoDB | Archive | NDB |
---|---|---|---|---|---|
Storage limits | 256TB | RAM | 64TB | None | 384EB |
Transactions | No | No | Yes | No | Yes |
Locking granularity | Table | Table | Row | Row | Row |
MVCC | No | No | Yes | No | No |
Geospatial data type support | Yes | No | Yes | Yes | Yes |
Geospatial indexing support | Yes | No | Yes[a] | No | No |
B-tree indexes | Yes | Yes | Yes | No | No |
T-tree indexes | No | No | No | No | Yes |
Hash indexes | No | Yes | No[b] | No | Yes |
Full-text search indexes | Yes | No | Yes[c] | No | No |
Clustered indexes | No | No | Yes | No | No |
Data caches | No | N/A | Yes | No | Yes |
Index caches | Yes | N/A | Yes | No | Yes |
Compressed data | Yes[d] | No | Yes[e] | Yes | No |
Encrypted data[f] | Yes | Yes | Yes | Yes | Yes |
Cluster database support | No | No | No | No | Yes |
Replication support[g] | Yes | Yes | Yes | Yes | Yes |
Foreign key support | No | No | Yes | No | Yes[h] |
Backup / point-in-time recovery[i] | Yes | Yes | Yes | Yes | Yes |
Query cache support | Yes | Yes | Yes | Yes | Yes |
Update statistics for data dictionary | Yes | Yes | Yes | Yes | Yes |
[a] InnoDB support for geospatial indexing is available in MySQL 5.7.5 and later.linux
[b] InnoDB utilizes hash indexes internally for its Adaptive Hash Index feature.git
[c] InnoDB support for FULLTEXT indexes is available in MySQL 5.6.4 and later.github
[d] Compressed MyISAM tables are supported only when using the compressed row format. Tables using the compressed row format with MyISAM are read only.面试
[e] Compressed InnoDB tables require the InnoDB Barracuda file format.sql
[f] Implemented in the server (via encryption functions). Data-at-rest tablespace encryption is available in MySQL 5.7 and later.数据库
[g] Implemented in the server, rather than in the storage engine.缓存
[h] Support for foreign keys is available in MySQL Cluster NDB 7.3 and later.安全
[i] Implemented in the server, rather than in the storage engine.
MySQL有多种存储引擎:
MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。
MySQL支持数个存储引擎做为对不一样表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎:
◆ MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在全部MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另一个引擎。
◆ MEMORY存储引擎提供“内存中”表。MERGE存储引擎容许集合将被处理一样的MyISAM表做为一个单独的表。就像MyISAM同样,MEMORY和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。
注释:MEMORY存储引擎正式地被肯定为HEAP引擎。
◆ InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操做系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里,你能够按照喜爱经过配置MySQL来容许或禁止任一引擎。
◆ EXAMPLE存储引擎是一个“存根”引擎,它不作什么。你能够用这个引擎建立表,但没有数据被存储于其中或从其中检索。这个引擎的目的是服务,在 MySQL源代码中的一个例子,它演示说明如何开始编写新存储引擎。一样,它的主要兴趣是对开发者。
◆ NDB Cluster是被MySQL Cluster用来实现分割到多台计算机上的表的存储引擎。它在MySQL-Max 5.1二进制分发版里提供。这个存储引擎当前只被Linux, Solaris, 和Mac OS X 支持。在将来的MySQL分发版中,咱们想要添加其它平台对这个引擎的支持,包括Windows。
◆ ARCHIVE存储引擎被用来无索引地,很是小地覆盖存储的大量数据。
◆ CSV存储引擎把数据以逗号分隔的格式存储在文本文件中。
◆ BLACKHOLE存储引擎接受但不存储数据,而且检索老是返回一个空集。
◆ FEDERATED存储引擎把数据存在远程数据库中。在MySQL 5.1中,它只和MySQL一块儿工做,使用MySQL C Client API。在将来的分发版中,咱们想要让它使用其它驱动器或客户端链接方法链接到另外的数据源。
当你建立一个新表的时候,你能够经过添加一个ENGINE 或TYPE 选项到CREATE TABLE语句来告诉MySQL你要建立什么类型的表:
CREATE TABLE t (i INT) ENGINE = INNODB;
CREATE TABLE t (i INT) TYPE = MEMORY;
虽然TYPE仍然在MySQL 5.1中被支持,如今ENGINE是首选的术语。
如何选择最适合你的存储引擎呢?
下述存储引擎是最经常使用的:
◆ MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其余应用环境下最常使用的存储引擎之一。注意,经过更改STORAGE_ENGINE配置变量,可以方便地更改MySQL服务器的默认存储引擎。
◆ InnoDB:用于事务处理应用程序,具备众多特性,包括ACID事务支持。
◆ BDB:可替代InnoDB的事务引擎,支持COMMIT、ROLLBACK和其余事务特性。
◆ Memory:将全部数据保存在RAM中,在须要快速查找引用和其余相似数据的环境下,可提供极快的访问。
◆ Merge:容许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一块儿,并做为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。
◆ Archive:为大量不多引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。
◆ Federated:可以将多个分离的MySQL服务器连接起来,从多个物理服务器建立一个逻辑数据库。十分适合于分布式环境或数据集市环境。
◆ Cluster/NDB:MySQL的簇式数据库引擎,尤为适合于具备高性能查找要求的应用程序,这类查找需求还要求具备最高的正常工做时间和可用性。
◆ Other:其余存储引擎包括CSV(引用由逗号隔开的用做数据库表的文件),Blackhole(用于临时禁止对数据库的应用程序输入),以及Example引擎(可为快速建立定制的插件式存储引擎提供帮助)。
请记住,对于整个服务器或方案,你并不必定要使用相同的存储引擎,你能够为方案中的每一个表使用不一样的存储引擎,这点很重要。
mysql> show engines; +------------+---------+----------------------------------------------------------------+ | Engine | Support | Comment | +------------+---------+----------------------------------------------------------------+ | MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | | InnoDB | YES | Supports transactions, row-level locking, and foreign keys | | BerkeleyDB | NO | Supports transactions and page-level locking | | BLACKHOLE | NO | /dev/null storage engine (anything you write to it disappears) | | EXAMPLE | NO | Example storage engine | | ARCHIVE | NO | Archive storage engine | | CSV | NO | CSV storage engine | | ndbcluster | NO | Clustered, fault-tolerant, memory-based tables | | FEDERATED | NO | Federated MySQL storage engine | | MRG_MYISAM | YES | Collection of identical MyISAM tables | | ISAM | NO | Obsolete storage engine | +------------+---------+----------------------------------------------------------------+ |
做者: jackbillow
支持多种存储引擎是众所周知的MySQL特性,也是MySQL架构的关键优点之一。若是可以理解MySQL Server与存储引擎之间是怎样经过API交互的,将大大有利于理解MySQL的核心基础架构。本文将首先介绍MySQL的总体逻辑架构,而后分析MySQL的存储引擎API并介绍如何编写本身的MySQL存储引擎。
MySQL做为一个大型的网络程序、数据管理系统,架构很是复杂。下图大体画出了其逻辑架构。
MySQL由如下几部分组成:
MySQL首先是一个网络程序,其在TCP之上定义了本身的应用层协议。因此要使用MySQL,咱们能够编写代码,跟MySQL Server创建TCP链接,以后按照其定义好的协议进行交互。固然这样比较麻烦,比较方便的办法是调用SDK,好比Native C API、JDBC、PHP等各语言MySQL Connector,或者经过ODBC。但经过SDK来访问MySQL,本质上仍是在TCP链接上经过MySQL协议跟MySQL进行交互。
每个基于TCP的网络服务都须要管理客户端连接,MySQL也不例外。MySQL会为每个链接绑定一个线程,以后这个链接上的全部查询都在这个线程中执行。为了不频繁建立和销毁线程带来开销,MySQL一般会缓存线程或者使用线程池,从而避免频繁的建立和销毁线程。
客户端链接到MySQL后,在使用MySQL的功能以前,须要进行认证,认证基于用户名、主机名、密码。若是用了SSL或者TLS的方式进行链接,还会进行证书认证。
MySQL支持DML(数据操做语言)、DDL(数据定义语言)、存储过程、视图、触发器、自定义函数等多种SQL语言接口。
MySQL会解析SQL查询,并为其建立语法树,并根据数据字典丰富查询语法树,会验证该客户端是否具备执行该查询的权限。建立好语法树后,MySQL还会对SQl查询进行语法上的优化,进行查询重写。
语法解析和查询重写以后,MySQL会根据语法树和数据的统计信息对SQL进行优化,包括决定表的读取顺序、选择合适的索引等,最终生成SQL的具体执行步骤。这些具体的执行步骤里真正的数据操做都是经过预先定义好的存储引擎API来进行的,与具体的存储引擎实现无关。
MySQL内部维持着一些Cache和Buffer,好比Query Cache用来缓存一条Select语句的执行结果,若是可以在其中找到对应的查询结果,那么就没必要再进行查询解析、优化和执行的整个过程了。
存储引擎的具体实现,这些存储引擎都实现了MySQl定义好的存储引擎API的部分或者所有。MySQL能够动态安装或移除存储引擎,能够有多种存储引擎同时存在,能够为每一个Table设置不一样的存储引擎。存储引擎负责在文件系统之上,管理表的数据、索引的实际内容,同时也会管理运行时的Cache、Buffer、事务、Log等数据和功能。
MySQL 5.7.11默认支持的存储引擎以下:
mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
全部的数据,数据库、表的定义,表的每一行的内容,索引,都是存在文件系统上,以文件的方式存在的。固然有些存储引擎好比InnoDB,也支持不使用文件系统直接管理裸设备,但现代文件系统的实现使得这样作没有必要了。
在文件系统之下,可使用本地磁盘,可使用DAS、NAS、SAN等各类存储系统。
MySQL定义了一系列存储引擎API,以支持插件式存储引擎架构。API以Handler类的虚函数的方式存在,可在代码库下的./sql/handler.h中查看详细信息,可在handler类的注释中看到描述:
/** The handler class is the interface for dynamically loadable storage engines. Do not add ifdefs and take care when adding or changing virtual functions to avoid vtable confusion Functions in this class accept and return table columns data. Two data representation formats are used: 1. TableRecordFormat - Used to pass [partial] table records to/from storage engine 2. KeyTupleFormat - used to pass index search tuples (aka "keys") to storage engine. See opt_range.cc for description of this format. TableRecordFormat ================= [Warning: this description is work in progress and may be incomplete] The table record is stored in a fixed-size buffer: record: null_bytes, column1_data, column2_data, ... //篇幅缘由,略去部份内容。 */ class handler :public Sql_alloc { //篇幅缘由,不列出具体代码。读者可直接在源码文件./sql/handler.h中找到具体内容。 }
下面我将分类描述部分存储引擎API。
经过函数create来建立一个table:
/** *name:要建立的表的名字 *from:一个TABLE类型的结构,要建立的表的定义,跟MySQL Server已经建立好的tablename.frm文件内容是匹配的 *info:一个HA_CREATE_INFO类型的结构,包含了客户端输入的CREATE TABLE语句的信息 */ int create(const char *name, TABLE *form, HA_CREATE_INFO *info);
经过函数open来打开一个table:
/** mode包含如下两种 O_RDONLY - Open read only O_RDWR - Open read/write */ int open(const char *name, int mode, int test_if_locked);
经过函数close来关闭一个table:
int close(void);
当客户端调用LOCK TABLE时,经过external_lock函数加锁:
int ha_example::external_lock(THD *thd, int lock_type)
//初始化全表扫描 virtual int rnd_init (bool scan); //从表中读取下一行 virtual int rnd_next (byte* buf);
//使用索引前调用该方法 int ha_foo::index_init(uint keynr, bool sorted) //使用索引后调用该方法 int ha_foo::index_end(uint keynr, bool sorted) //读取索引第一条内容 int ha_index_first(uchar * buf); //读取索引下一条内容 int ha_index_next(uchar * buf); //读取索引前一条内容 int ha_index_prev(uchar * buf); //读取索引最后一条内容 int ha_index_last(uchar * buf); //给定一个key基于索引读取内容 int index_read(uchar * buf, const uchar * key, uint key_len, enum ha_rkey_function find_flag)
//开始一个事务 int my_handler::start_stmt(THD *thd, thr_lock_type lock_type) //回滚一个事务 int (*rollback)(THD *thd, bool all); //提交一个事务 int (*commit)(THD *thd, bool all);
在MySQL的官方文档上,有对于编写本身的存储引擎的指导文档,连接以下。
做为编写本身存储引擎的开始,你能够查看MySQL源码库中的一个EXAMPLE存储引擎,它实现了必需要实现的存储引擎API,能够经过复制它们做为编写咱们本身存储引擎的开始:
sed -e s/EXAMPLE/FOO/g -e s/example/foo/g ha_example.h > ha_foo.h sed -e s/EXAMPLE/FOO/g -e s/example/foo/g ha_example.cc > ha_foo.cc
2017-03-18 10:25 by 潇湘隐者, 1266 阅读, 1 评论, 收藏, 编辑
本文总结了MySQL下查看、修改存储引擎的一些方法。测试、验证环境为MySQL 5.6 ,若有差别,请以实际版本为准
1:查看MySQL的存储引擎信息
1.1 使用show engines命令。
Support列, YES表示当前版本支持这个存储引擎, DEFAULT表示该引擎是默认的引擎。NO表示不支持该存储引擎。以下所示,InnoDB是默认的存储引擎。
1.2 能够查看系统变量default_storage_engine或storage_engine
1:default_storage_engine 表示永久表(permanent tables)的默认存储引擎。
2:default_tmp_storage_engine 表示临时表的默认存储引擎。
storage_engine这个系统变量不推荐使用,它已经被系统变量default_storage_engine替代了。
mysql> show variables like '%storage_engine%';
+----------------------------+--------+
| Variable_name | Value |
+----------------------------+--------+
| default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| storage_engine | InnoDB |
+----------------------------+--------+
3 rows in set (0.01 sec)
mysql>
2:如何修改MySQL的默认存储引擎?
2.1 修改my.cnf,在配置文件里面增长参数default-storage-engine,而后重启数据库服务。
[mysqld]
default-storage-engine=MyISAM
而后检查默认存储引擎,就会看到MyISAM为默认存储引擎了。
2.2 使用命令修改系统变量(system variables)
注意,这个系统变量default_storage_engine是BOTH(全局和临时),并且能够动态修改。可是要注意,即便你修改了系统变量default_storage_engine,重启事后就会失效,若是你要永久修改,最好在my.cnf配置文件里面也设置default-storage-engine的值。
3:如何查看表使用的存储引擎?
查看表所用的存储引擎,有下面几种方法:
3.1 查询information_schema.TABLES
mysql> SELECT TABLE_SCHEMA,
-> TABLE_NAME,
-> TABLE_TYPE,
-> ENGINE
-> FROM information_schema.TABLES
-> WHERE TABLE_NAME = 'TEST';
+--------------+------------+------------+--------+
| TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | ENGINE |
+--------------+------------+------------+--------+
| gsp | TEST | BASE TABLE | InnoDB |
+--------------+------------+------------+--------+
1 row in set (0.00 sec)
mysql>
3.2 使用SHOW CREATE TABLE TEST \G命令。
mysql> SHOW CREATE TABLE TEST \G;
*************************** 1. row ***************************
Table: TEST
Create Table: CREATE TABLE `TEST` (
`ID` int(11) DEFAULT NULL,
`COL1` varchar(6) DEFAULT NULL,
`COL2` varchar(6) DEFAULT NULL,
`COL3` varchar(6) DEFAULT NULL,
`COL4` varchar(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
ERROR:
No query specified
mysql>
3.3 SHOW TABLE STATUS
mysql> SHOW TABLE STATUS WHERE Name='TEST';
ERROR 1046 (3D000): No database selected
mysql>
mysql>
mysql> use gsp;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> SHOW TABLE STATUS WHERE Name='TEST';
如上所示,这种写法必须制定数据库,不然,你只能使用下面语法
SHOW TABLE STATUS [{FROM | IN} db_name]
[LIKE 'pattern' | WHERE expr]
mysql> SHOW TABLE STATUS FROM gsp WHERE Name='TEST';
4:如何修改相关表的存储引擎?
修改表的存储引擎很是简单,语法以下所示
ALTER TABLE my_table ENGINE = InnoDB;
mysql> ALTER TABLE TEST ENGINE=MyISAM;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE TEST \G;
*************************** 1. row ***************************
Table: TEST
Create Table: CREATE TABLE `TEST` (
`ID` int(11) DEFAULT NULL,
`COL1` varchar(6) DEFAULT NULL,
`COL2` varchar(6) DEFAULT NULL,
`COL3` varchar(6) DEFAULT NULL,
`COL4` varchar(6) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
ERROR:
No query specified
mysql>
5:建立表的时候如何指定存储引擎。
建立表的时候,若是要指定存储引擎,只须要设置参数ENGINE便可。很是简单。
mysql> CREATE TABLE TEST1 (ID INT) ENGINE=InnoDB;
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE TABLE TEST2 (ID INT) ENGINE=MyISAM;
Query OK, 0 rows affected (0.00 sec)
参考资料:
https://dev.mysql.com/doc/refman/5.6/en/storage-engine-setting.html
https://dev.mysql.com/doc/refman/5.7/en/storage-engine-setting.html
About Me
.............................................................................................................................................
● 本文整理自网络
● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客园(http://www.cnblogs.com/lhrbest)和我的微信公众号(xiaomaimiaolhr)上有同步更新
● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/
● 本文博客园地址:http://www.cnblogs.com/lhrbest
● 本文pdf版、我的简介及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/
● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/
● DBA宝典今日头条号地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826
.............................................................................................................................................
● QQ群号:230161599(满)、618766405
● 微信群:可加我微信,我拉你们进群,非诚勿扰
● 联系我请加QQ好友(646634621),注明添加原因
● 于 2017-08-01 09:00 ~ 2017-08-31 22:00 在魔都完成
● 文章内容来源于小麦苗的学习笔记,部分整理自网络,如有侵权或不当之处还请谅解
● 版权全部,欢迎分享本文,转载请保留出处
.............................................................................................................................................
● 小麦苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail
● 小麦苗出版的数据库类丛书:http://blog.itpub.net/26736162/viewspace-2142121/
.............................................................................................................................................
使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号(xiaomaimiaolhr)及QQ群(DBA宝典),学习最实用的数据库技术。
小麦苗的微信公众号 小麦苗的DBA宝典QQ群1 小麦苗的DBA宝典QQ群2 小麦苗的微店
.............................................................................................................................................
![]()
来自 “ ITPUB博客 ” ,连接:http://blog.itpub.net/26736162/viewspace-2143926/,如需转载,请注明出处,不然将追究法律责任。