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系統級別的事務隔離級別: 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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 党支部(说一说党支部的简介)
- 下一篇: PHP实现数组中两个数的和等于给定的目标