前言

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 COMMITTEDREAD UNCOMMITTEDREPEATABLE 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 TABLEALTER 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系统级别的事务隔离级别:
mysql> SELECT @@global.tx_isolation;
查看InnoDB会话级别的事务隔离级别:
mysql> 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 dba系统学习(20)mysql存储引擎MyISAM

    mysql存储引擎MyISAM 1,创建myisam表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 mysql> creat ...

  2. MySQL存储引擎(InnoDB引擎)

    本篇章主要介绍什么是 MySQL 存储引擎?常用的 MySQL 存储引擎有哪些?以及详细介绍一下目前应用最广泛的 InnoDB 存储引擎,包括其:逻辑存储结构.架构.事务原理.MVCC等. 一.初识  ...

  3. mysql存储引擎中INNODB和MyISAM的区别

    切记:存储引擎是基于表的,而不是数据库. 存储引擎概念: MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不 ...

  4. MySQL 存储引擎(InnoDB、MyISAM、MEMORY)

    一.MySQL的体系结构 1.连接层:最上层是一些客户端和链接服务,主要完成一些类似于连接处理.授权认证.及相关的安全方案.服务器也会为安全接入的每个客户端验证它所具有的操作权限. 2.服务层:第二成 ...

  5. MySQL - 存储引擎MyISAM和Innodb

    1. 概述 首先,我们先看一下MySQL的体系架构,对MySQL整个架构有一个直观的感受: MySQL Server架构自顶向下大致可以分网络连接层.服务层.存储引擎层和系统文件层. 存储引擎在MyS ...

  6. MySQL存储引擎及InnoDB并发控制介绍

    MySQL存储引擎采用了可插拔的结构,即用户可以根据自己的需要来选择不同的存储引擎. 下表是MySQL不同的存储引擎的不同的特性: Feature<?xml:namespace prefix = ...

  7. Mysql存储引擎MyIsAM和InnoDB区别

    Mysql 数据库中,最常用的两种引擎是innordb 和myisam.InnoDB 是Mysql 的默认存储引擎. 两者的区别: 1.事务处理上方面 MyISAM:强调的是性能,查询的速度比Inno ...

  8. MySQL 存储引擎 | MyISAM 与 InnoDB

    文章目录 概念 innodb引擎的4大特性 索引结构 InnoDB MyISAM 区别 表级锁和行级锁 概念 MyISAM 是 MySQL 的默认数据库引擎(5.5版之前),但因为不支持事务处理而被 ...

  9. 浅谈MySQL存储引擎选择 InnoDB还是MyISAM

    如果是一些小型的应用或项目,那么MyISAM 也许会更适合.当然,在大型的环境下使用MyISAM 也会有很大成功的时候,但却不总是这样的.如果你正在计划使用一个超大数据量的项目,那么你应该直接使用In ...

最新文章

  1. 中文.TW台湾域名首度向大陆开放
  2. 如何用jsp在线自动批改_推荐:5个好用的免费自动化在线营销工具
  3. windows上不同版本的CUDA、cudnn是否能够共用?
  4. mysql数据库入门教程(7):库和表的管理
  5. python如何读取csv文件列表页_每25行读取一个csv文件,并使用python传递到列表
  6. 一年代码功能点的创新性怎么写_查新报告的查新点(创新点)写法,参考
  7. 叶金荣mysql教程_mysql优化--叶金荣老师讲座笔记
  8. 问题 | kali系统隐藏sshd的banner信息
  9. HEVC将会取代H.264的原因
  10. 数字逻辑_逻辑函数化简(配项法)例子
  11. 字节、KB、MB、GB 之间的换算关系
  12. 计算机ps移动是什么键,ps快捷键都有哪些 移动工具V等
  13. python车牌识别(包括SVM原理)
  14. Laravel项目实战中如何快速集成Emoji表情包?Emoji表情包太丰富了
  15. java 文档比较功能_[原创]java在线比较两个word文件
  16. Spectacle源码及分析1 —— 源码概览
  17. 水下超声波测距c语言程序,超声波测距51C程序
  18. 算法小记(1)--判断三个数的最大,最小
  19. 常用的cmd命令与Linux命令
  20. 西三旗限价房之旗胜家园实景

热门文章

  1. 福州java培训哪里好_广州java学习哪里好?需要学多长时间
  2. 16、分布式文档系统--document的_source元数据以及定制返回结果解析(来自学习资料+自己整理)
  3. Jetty在win10上的配置,IDEA中配置Jetty,Maven中配置Jetty插件,Eclipse中配置Jetty插件及其使用,通过java代码内嵌Jetty Server
  4. 6.Maven聚合和继承,相关案例配置
  5. Java与C#平台通信 WCF CXF SOAP
  6. [深度学习基础] 5. 实现细节
  7. 如何编写testbench的总结(非常实用的总结)
  8. PGM中的有向分离(d-separation)和 active trail
  9. 本人对于netty框架的一些理解,怎么与网站上的websock建立连接
  10. Terraform入门 - 4. destroy 基础设施