前言

MySQL 的存储引擎可能是所有关系型数据库产品中最具有特色的了,不仅可以同时使用多种存储引擎,而且每种存储引擎和MySQL之间使用插件方式这种非常松的耦合关系。

由于各存储引擎功能特性差异较大,这篇文章主要是介绍如何来选择合适的存储引擎来应对不同的业务场景。

MyISAM

1.特性

  不支持事务:MyISAM存储引擎不支持事务,所以对事务有要求的业务场景不能使用



  表级锁定:其锁定机制是表级索引,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能



  读写互相阻塞:不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读



  只会缓存索引:MyISAM可以通过key_buffer缓存以大大提高访问性能减少磁盘IO,但是这个缓存区只会缓存索引,而不会缓存数据

2.适用场景

  不需要事务支持(不支持)



  并发相对较低(锁定机制问题)



  数据修改相对较少(阻塞问题)



  以读为主



  数据一致性要求不是非常高

3.最佳实践

  尽量索引(缓存机制)



  调整读写优先级,根据实际需求确保重要操作更优先



  启用延迟插入改善大批量写入性能



  尽量顺序操作让insert数据都写入到尾部,减少阻塞



  分解大的操作,降低单个操作的阻塞时间



  降低并发数,某些高并发场景通过应用来进行排队机制



  对于相对静态的数据,充分利用Query Cache可以极大的提高访问效率



  MyISAM的Count只有在全表扫描的时候特别高效,带有其他条件的count都需要进行实际的数据访问

InnoDB

1.特性

  具有较好的事务支持:支持4个事务隔离级别,支持多版本读



  行级锁定:通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响



  读写阻塞与事务隔离级别相关



  具有非常高效的缓存特性:能缓存索引,也能缓存数据



  整个表和主键以Cluster方式存储,组成一颗平衡树



  所有Secondary Index都会保存主键信息

2.适用场景

  需要事务支持(具有较好的事务特性)



  行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成



  数据更新较为频繁的场景



  数据一致性要求较高



  硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘 IO

3.最佳实践

  主键尽可能小,避免给Secondary index带来过大的空间负担



  避免全表扫描,因为会使用表锁



  尽可能缓存所有的索引和数据,提高响应速度



  在大批量小插入的时候,尽量自己控制事务而不要使用autocommit自动提交



  合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性



  避免主键更新,因为这会带来大量的数据移动

NDBCluster

1.特性

  分布式:分布式存储引擎,可以由多个NDBCluster存储引擎组成集群分别存放整体数据的一部分



  支持事务:和Innodb一样,支持事务



  可与mysqld不在一台主机:可以和mysqld分开存在于独立的主机上,然后通过网络和mysqld通信交互



  内存需求量巨大:新版本索引以及被索引的数据必须存放在内存中,老版本所有数据和索引必须存在与内存中

2.适用场景

  具有非常高的并发需求



  对单个请求的响应并不是非常的critical



  查询简单,过滤条件较为固定,每次请求数据量较少,又不希望自己进行水平Sharding

3.最佳实践

  尽可能让查询简单,避免数据的跨节点传输



  尽可能满足SQL节点的计算性能,大一点的集群SQL节点会明显多余Data节点

  在各节点之间尽可能使用万兆网络环境互联,以减少数据在网络层传输过程中的延时

4. 它的限制

4.1 不支持临时表。



4.2 不支持基于TEXT and BLOB 字段的索引。



4.3 不支持FULLTEXT indexes.



4.4 不支持字段部分索引。

There are no prefix indexes; only entire columns can be indexed (The size of an NDB column index is always the same as the width of the column in bytes, up to and including 3072 bytes, as described earlier in this section. Also see Section 18.1.6.6, “Unsupported
or Missing Features in MySQL Cluster”, for additional information.)



4.5 AUTO_INCREMENT 必须索引。

Like other MySQL storage engines, the NDB storage engine can handle a maximum of one AUTO_INCREMENTcolumn per table, and this column must be indexed. However, in the case of a MySQL Cluster table with no explicit primary key, anAUTO_INCREMENT column is automatically
defined and used as a “hidden” primary key. For this reason, you cannot create an NDB table having anAUTO_INCREMENT column and no explicit primary key.



4.6 只支持READ COMMITTED

The NDBCLUSTER storage engine supports only the READ COMMITTED transaction isolation level. (InnoDB, for example, supports READ COMMITTED, READ UNCOMMITTED, REPEATABLE READ, and SERIALIZABLE.)



4.7 不支持Index prefixes.

Prefixes on indexes are not supported for NDB tables. If a prefix is used as part of an index specification in a statement such as CREATE TABLE, ALTER TABLE, or CREATE INDEX, the prefix is not created by NDB.



4.8 不支持基于语句的复制。

Statement-based replication is not supported. Use --binlog-format=ROW (or --binlog-format=MIXED) when setting up cluster replication. See Section 18.6, “MySQL Cluster Replication”, for more information.



Replication using global transaction identifiers (GTIDs) is not compatible with MySQL Cluster, and is not supported in MySQL Cluster NDB 7.3 or MySQL Cluster NDB 7.4. Do not enable GTIDs when using the NDB storage engine, as this is very likely to cause problems
including failure of MySQL Cluster Replication



4.9 Range scans 代价高

There are query performance issues due to sequential access to the NDB storage engine; it is also relatively more expensive to do many range scans than it is with either MyISAM or InnoDB.



具体信息见:http://dev.mysql.com/doc/refman/5.6/en/mysql-cluster-limitations-syntax.html

注:以上三个存储引擎是目前相对主流的存储引擎,还有其他类似如:Memory,Merge,CSV,Archive等存储引擎的使用场景都相对较少,这里就不一一分析了。



4.10 不支持XA (事务分布式事务处理)

XA transaction support is limited to the InnoDB storage engine.

http://dev.mysql.com/doc/refman/5.6/en/xa-restrictions.html

在MySQL中默认事务隔离级别是可重复读(Repeatable read).可通过SQL语句查询:

查看InnoDB系统级别的事务隔离级别:

SELECT @@global.tx_isolation;

查看InnoDB会话级别的事务隔离级别:

SELECT @@tx_isolation;

How to find Engine version

mysql> SELECT VERSION()\G
*************************** 1. row ***************************
VERSION(): 5.6.27-ndb-7.4.8-alu-v2-log
1 row in set (0.05 sec)

转载地址:http://blog.csdn.net/bigtree_3721/article/details/51336341

MySQL 存储引擎(MyISAM、InnoDB、NDBCluster)的更多相关文章

  1. mysql 存储引擎 myisam innodb 区别

    虽然MySQL里的存储引擎不只是MyISAM与InnoDB这两个,但常用的就是它俩了.可能有站长并未注意过MySQL的存储引擎,其实存储引擎也是数据库设计里的一大重要点,那么博客系统应该使用哪种存储引 ...

  2. MySQL存储引擎 - Myisam和Innodb

    Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比   MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个 文件的名字以表的名字开始 ...

  3. mysql修改表的存储引擎(myisam<=>innodb)【转】

    修改表的存储引擎myisam<=>innodb 查看表的存储引擎mysql> show create table tt7;+-------+--------------------- ...

  4. MySQL存储引擎MyISAM与InnoDB

    一. MySQL存储引擎MyISAM与InnoDB如何选择 MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM.InnoDB.MERGE.MEMORY(HEAP).B ...

  5. MySQL存储引擎MyISAM和InnoDB,索引结构优缺点

    MySQL存储引擎MyISAM和InnoDB底层索引结构 深入理解MySQL索引底层数据结构与算法 (各种索引结构优缺点) Myisam和Innodb索引实现的不同(存储结构) 存储引擎作用于什么对象 ...

  6. MySQL存储引擎 -- MyISAM(表锁定) 与 InnoDB(行锁定) 锁定机制

    前言 为了保证数据的一致完整性,任何一个数据库都存在锁定机制.锁定机制的优劣直接应想到一个数据库系统的并发处理能力和性能,所以锁定机制的实现也就成为了各种数据库的核心技术之一.本章将对MySQL中两种 ...

  7. MySQL存储引擎【InnoDB、MyISAM、Memory】

    数据库,MySQL这样存在多存储引擎的数据库软件,清楚常见的存储引擎的区别,使用合适的存储引擎,使得项目跑的更顺畅,有时候对于一个项目,甚至比项目本身都重要.这篇文章,旨在浅谈常见的三种存储引擎的区别 ...

  8. MySQL存储引擎:InnoDB和MyISAM的差别/优劣评价/评测/性能测试

    InnoDB和MyISAM简介 MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的 顺序访问方法) 的缩写 ...

  9. MySQL存储引擎MyISAM与InnoDB区别总结整理

    在MySQL的 可重复读隔离级别 中,是解决了幻读的读问题的. 1. MySQL默认存储引擎的变迁 在MySQL 5.5之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默 ...

  10. 170309、MySQL存储引擎MyISAM与InnoDB区别总结整理

    1.MySQL默认存储引擎的变迁 在MySQL 5.1之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB. 2.MyISAM与InnoDB存 ...

随机推荐

  1. java字符,字符串,数字之间的转换

    string 和int之间的转换 string转换成int  :Integer.valueOf("12") int转换成string : String.valueOf(12) ch ...

  2. Thymeleaf(一)---引入js/css文件

    th:href="@{/static/css/style.css}" th:src="@{/static/js/thymeleaf.js}" index.htm ...

  3. 7.8 Varnish 其他命令

  4. hadoop 配置问题以及HDFS下如何读写文件

    辛辛苦苦学两年 ,一举回到解放前!!! 大数据开始学真的头疼 关键是linux你玩的不6 唉难受 hadoop 配置参见博客 http://dblab.xmu.edu.cn/blog/install- ...

  5. msf自动连接postgresql配置

    今天做了一下msf连接数据库的配置,中间碰到了一些坑点这里就不详细叙述了,开始正确的操作方式. 首先对postgresql进行配置以方便连接. root@kali:~# service postgre ...

  6. UVA - 12083 Guardian of Decency (二分匹配)

    题意:有N个人,已知身高.性别.音乐.运动.要求选出尽可能多的人,使这些人两两之间至少满足下列四个条件之一. 1.身高差>40  2.性别相同  3.音乐不同  4.运动相同 分析: 1.很显然 ...

  7. C++ Winsock

    由于兼容的问题更新下winsock,有较好的移植性:客户端是非阻塞的,服务器是阻塞的! Win32控制台: 数据收发: 服务器向客户端发送一个txt文本内容和一个结构体数据: 服务器代码: #incl ...

  8. 035-PHP简单定义一个闭包函数

    <?php /* + 什么是闭包函数?即一个函数内部,包含了1-N个匿名函数, + 用处是可以做局部数据缓存与实现封装(有点类似class) */ # 函数内部,定义一个匿名函数,即可称为闭包函 ...

  9. JavaScript获取当前日期前后7天的日期

    function fun_date(aa){ var date1 = new Date(), time1=date1.getFullYear()+"-"+(date1.getMon ...

  10. HTML布局梳理

    布局是一个很艺术的话题,即使是相同的HTML文档结构,但加上不同的css样式就会呈现出不同的效果.接下来就来总结一下html常用的布局. 一.布局的分类: 根据页面板块分类: 页面的板块主要是根据栏目 ...