MySQL 存储引擎(MyISAM、InnoDB、NDBCluster)

前言

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

上一篇:js中Unicode转义序列


下一篇:论文阅读(Chenyi Chen——【ACCV2016】R-CNN for Small Object Detection)