数据库的一些基本知识(1)------数据库引擎
MySQL数据库提供了十三种不同的存储引擎来应对不同的数据处理。大部分使用过MySQL的人应该都知道MySQL所常用的两个存储引擎:MyISAM 和 InnoDB。大多数情况下,MyISAM 是作为MySQL默认的存储引擎而存在的。事实上我们大多数人在使用MySQL的时候都没有去配置存
MySQL数据库提供了十三种不同的存储引擎来应对不同的数据处理。大部分使用过MySQL的人应该都知道MySQL所常用的两个存储引擎:MyISAM 和 InnoDB。大多数情况下,MyISAM 是作为MySQL默认的存储引擎而存在的。事实上我们大多数人在使用MySQL的时候都没有去配置存储引擎而直接采用MySQL默认的MyISAM 。如果你需要在特定的表上面使用特定的存储引擎,你可以使用下面的命令行:CREATE TABLE tablename (column1, column2, [etc...]) ENGINE = [storage_engine].那么什么是数据库引擎呢?
简单说来,一个数据库的存储引擎就是用来对数据表进行信息存储、处理、查询等操作。这个世界上不存在十全十美的存储引擎,但是对于大部分的应用来说,默认的MyISAM 就够用了。在MySQL内置的10种不同的存储引擎中,并不是所有的引擎都是可用的。你可以使用下面的命令来查询你的MySQL服务器提供的存储引擎:
代码:
mysql -uroot -p Password: mysql> show engines;这个命令会列出你的服务器所支持的存储引擎列表:
MyISAM
InnoDB
MERGE
MEMORY (HEAP)
BDB (BerkeleyDB)
EXAMPLE
ARCHIVE
CSV
BLACKHOLE
ISAM 你可以根据你自己的应用需求来选择对于的存储引擎。例如,如果你需要存储大量的日志数据,那么你可以使用只支持INSERT和SELECT操作的ARCHIVE 存储引擎。你可以对你的数据库服务器、数据库或者表格设置特定的存储引擎,这种灵活的可配置性也是MySQL比起那些只支持单一存储引擎的数据库更加受欢迎的原因。
MyISAM
MyISAM 事实上是 ISAM 存储引擎的一个分支。如果你的应用不需要TRANSACTION,也不需要行级别的锁(它只提供表级别的锁),那么这是选择MyISAM是最优方案了。MyISAM 特别适合于INSERT/UPDATE操作少而SELECT 操作多的应用场景。当你的应用需要进行大量的INSERT/UPDATE操作时,你需要考虑是否应该换一个存储引擎,因为表级别的锁会让这个操作造成性能问题。
MyISAM 支持的最大行数为 ~4.29E+09,每个表的索引数目限制为64。MyISAM 同时也为 TEXT/BLOB类型的列提供了全索引支持,这样很方便进行搜索等操作。InnoDB
相对于MyISAM, InnoDB提供了更多特性来提升系统性能。这也导致了InnoDB在初始化的时候会比MyISAM花更多的时间,但是这样带来的好处远比初始化额外花的时间要多。其中一个主要的不同就是InnoDB提供了行级别的锁。这就为并发的 INSERT/UPDATE/DELETE 操作提供了可能,不像MyISAM那样要等一个操作完成才能进行下一个操作。
同时, InnoDB 还提供了外键功能。这可以保证你在往表二插入数据之前表一的相关数据已经存在。而且这还会阻止你在表一中删除表二所依赖的数据。InnoDB还提供了数据的缓存已经在内存和磁盘上建立索引,这样可以大大的提升系统性能。也许对于那些低内存的系统来说,这不是一个理想的解决方案,但是对于内存足够的系统来说就不是问题了。
MERGEMERGE ,从MySQL 3.23.25 开始添加的存储引擎。它让用户可以对一个MyISAM 集合进行统一操作,就像是操作一个表一样。但是使用这个引擎有一些约束,比如所有的表格都必须是统一的定义。
MEMORY (HEAP)
HEAP 存储引擎,也叫做 MEMORY,允许在内存里面建表。MySQL 服务器会保留表的格式,这样可以快速的创建一个“trash”表,然后快速的读取数据以便更好的处理。不过这也使得这个存储引擎不适合长期的数据处理。
BDB (BerkeleyDB)
BerkeleyDB存储引擎处理事务安全的表,并以哈希为基础的存储系统。这个存储引擎适合快速的读写某些数据,特别是不同key的数据。但是这个存储引擎有不少缺点,比如在没有索引的列上速度很慢。也因为这个原因人们都忽视了它。我还是相信它有它的用武之地。
EXAMPLEEXAMPLE,从MySQL 4.1.3 开始添加的存储引擎。这个存储引擎主要是为程序员服务的。EXAMPLE 提供了创建表的能力,但是无法插入或者查询信息。
ARCHIVEARCHIVE,从MySQL 4.1.3 开始添加的存储引擎,它经常被用来存储大规模数据(无需索引)。这个存储引擎只支持 INSERT 和 SELECT操作,而且所有的信息都是被压缩过的。这些特性让ARCHIVE很适合用来存储日志、交易记录、账户等。不过需要注意的是,在读取数据的时候,整个表都需要在数据返回之前解压并读取。因此这个存储引擎最适合使用频率较低的场景。
CSV
CSV, 从MySQL 4.1.4开始添加的存储引擎,以逗号分隔的字符串存储数据。因此这个存储引擎不适合大规模的数据存储或者需要索引的数据表等场景。这个存储引擎适合将数据转成spreadsheet 文件。
BLACKHOLE
这个存储引擎似乎看起来没什么用处,因为它不允许任何数据的存储或者查询。因此BLACKHOLE 通常被用来测试数据库的结构、索引和擦查询。你仍然可以使用 INSERTS 命令来插入,只不过所有的数据都是void
ISAM
最原始的存储引擎就是ISAM, 它管理着非事务性表。后来它就被MyISAM 代替了,而且MyISAM 是向后兼容的,因此你可以忘记这个ISAM存储引擎。
总结
总的说来,没有十全十美的数据库存储引擎。对于大多数的应用和DBA来说,选用InnoDB 和 MyISAM 基本就够用了。但是也要记住,InnoDB 和 MyISAM 虽然比较通用,但是它们并不是对所有的场景都是完美支持的,也许其他的存储引擎可以很好地支持你的应用。
下一集预告:
数据库事务隔离机制及特点;
参考文献:
1、http://www.linux.org/threads/an-introduction-to-mysql-storage-engines.4220/