前言

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. /etc/fstab 只读无法修改的解决办法

    在做saltstack的时候不小心误把/etc/fstab给注释了 在命令补全的时候开始报错:[root@kafka2 ~]# cat /et-bash: cannot create temp fil ...

  2. 7.8 Varnish Log

  3. CSS样式表——列表与布局

    列表方块:针对<ol></ol>和<ul></ul> 属性style="list-style:none"               ...

  4. 一文详解scala泛型及类型限定

    今天知识星球球友,微信问浪尖了一个spark源码阅读中的类型限定问题.这个在spark源码很多处出现,所以今天浪尖就整理一下scala类型限定的内容.希望对大家有帮助. scala类型参数要点 1. ...

  5. ruby资料

    源码样例 链接: https://pan.baidu.com/s/1mh55bFM 密码: 6cjy 初级代码 链接: https://pan.baidu.com/s/1hschnUW 密码: 8n1 ...

  6. springboot启动微服务项目时,启动后没有端口号信息,也访问不了

    2018-06-05 13:43:42.282 [localhost-startStop-1] DEBUG org.apache.catalina.core.ContainerBase - Add c ...

  7. springboot#filter

    _ Filter不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链.完 ...

  8. 五十六、SAP中LVC表格的常用布局属性LVC_S_LAYO

    一.LVC_S_LAYO为表格常用的布局属性,包括网格线,宽度自适应,隐藏主键等 二.我们来对比使用前和使用后的表格,这个原始布局风格的表格 三.这个是设置了相关属性的表格

  9. Node.js NPM Package.json

    章节 Node.js NPM 介绍 Node.js NPM 作用 Node.js NPM 包(Package) Node.js NPM 管理包 Node.js NPM Package.json Nod ...

  10. 每天一点点之 taro 框架开发 - 事件处理与样式表

    1.方法调用 state = { name:'张三' } test(){ this.state.name } <button onClick={ this.test.bind(this) } / ...