|
存储引擎是什么?
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。
例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。
这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。
选择如何存储和检索你的数据的这种灵活性是MySQL为什么如此受欢迎的主要原因。其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储。遗憾的是,其它类型的数据库解决方案采取的“一个尺码满足一切需求”的方式意味着你要么就牺牲一些性能,要么你就用几个小时甚至几天的时间详细调整你的数据库。使用MySQL,我们仅需要修改我们使用的存储引擎就可以了。
在这篇文章中,我们不准备集中讨论不同的存储引擎的技术方面的问题(尽管我们不可避免地要研究这些因素的某些方面),相反,我们将集中介绍这些不同的引擎分别最适应哪种需求和如何启用不同的存储引擎。为了实现这个目的,在介绍每一个存储引擎的具体情况之前,我们必须要了解一些基本的问题。
MySQL支持许多不同的存储引擎,有时候也称作表格类型。数据库每个表可以有不同的存储引擎,而且可以轻松地对它们进行转换。 Create TABLE tablename TYPE=typename 可能的表格类型包括: 1 MyISAM--这是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method(有索引的顺序访问方法)的缩写,它是存储记录和文件的标准方法。与其它存储引擎相比较,MyISAM具有和修复表格的大多数工具。MyISAM表格可以被压缩,而且它们支持全文搜 索。它们不是事务安全的(关于事务的概念,稍后会讲),而且也不支持外键。 2 ISAM--如上所描述的。ISAM表格的使用已经被废弃了。 3 MEMORY(也就是以前的HEAP)--该类的表存储在内存中,表的索引是哈希分布的。这使 得MEMORY表格非常快,但是如果发生崩溃,数据将丢失。这些特性使得MEMORY表非常适合保 存临时数据或者派生的数据。应该在Create TABLE语句中指定MAX_ROWS,否则这些表可 能会吞噬所有的内存。同样,它们也不能具有BLOB、TEXT或AUTO INCREMENT列。 4 MERGE--这些表允许你为了查询的目的,把MyISAM表的集合作为一个单个表。因此,你 可在某些操作中避开最大文件大小限制。 5 BDB--这种类型的表是事务安全的,也就是说,它们可以提供COMMIT秋ROLLBACK功能 ,但使用起来比MyISAM表速度慢,但是可以提供使用事务的所有优点。这些表格都是基于 Berkeley DB的。 6 InnoDB--这种类型的表是事务安全的。它与BDB类型具有相同的特性。它们还支持外键。 InnoDB表格速度很快,具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎, 建议使用它。 在大多数Web应用程序中,通常都会使用MyISAM或InnoDB表格或者二者的结合。 当对一个表格使用大量的Select或Insert语句(或者二者的结合)时,应该使用MyISAM 表格,因为在执行这两种命令时,MyISAM是最快的。对于许多Web应用程序(例如分类)来说 ,MyISAM是最佳选择。如果需要全文搜索功能,也应该使用MyISAM。当事务非常重要(例如存 储财务数据的表格),或在Insert和Select语句是交错执行的情况下(例如在线论坛系统), 应该使用InnlDB.对于临时表格或要是实现视图,可以使用MEMORY表格。如果需要处理大量的MyISAM表格,可以使用MERGE表格。 使用Alter TABLE语句,可以在创建表格后修改表格的类型,如下所示: Alter TABLE tablename TYPE=typename;
事务 事务是确保数据库一致的机制,尤其是在发生错误或服务器崩溃情况下确保一致的机制。 事务是一个或一系列的查询,这些查询可以保证能够在数据库中作为一个整体全部执行或者全部 不执行。这样,数据库才能在无论任务是否完成的情况下保持一致状态。
如何确定有哪些存储引擎可用
你可以在MySQL(假设是MySQL服务器4.1.2以上版本)中使用显示引擎的命令得到一个可用引擎的列表。
Mysql> show engines; +------------+---------+------------------------------------------------------------+ | Engine | Support | Comment | +------------+---------+------------------------------------------------------------+ | MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | | HEAP | YES | Alias for MEMORY | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | | MERGE | YES | Collection of identical MyISAM tables | | MRG_MYISAM | YES | Alias for MERGE | | ISAM | NO | Obsolete storage engine, now replaced by MyISAM | | MRG_ISAM | NO | Obsolete storage engine, now replaced by MERGE | | InnoDB | YES | Supports transactions, row-level locking, and foreign keys | | INNOBASE | YES | Alias for INNODB | | BDB | NO | Supports transactions and page-level locking | | BERKELEYDB | NO | Alias for BDB | | NDBCLUSTER | NO | Clustered, fault-tolerant, memory-based tables | | NDB | NO | Alias for NDBCLUSTER | | EXAMPLE | NO | Example storage engine | | ARCHIVE | NO | Archive storage engine | | CSV | NO | CSV storage engine | +------------+---------+------------------------------------------------------------+ 16 rows in set (0.01 sec) 这个表格显示了可用的数据库引擎的全部名单以及在当前的数据库服务器中是否支持这些引擎。
对于MySQL 4.1.2以前版本,可以使用mysql> show variables like "have_%"(显示类似“have_%”的变量):
mysql> show variables like "have_%"; +------------------+----------+ | Variable_name | Value | +------------------+----------+ | have_bdb | YES | | have_crypt | YES | | have_innodb | DISABLED | | have_isam | YES | | have_raid | YES | | have_symlink | YES | | have_openssl | YES | | have_query_cache | YES | +------------------+----------+ 8 rows in set (0.01 sec)
你可以通过修改设置脚本中的选项来设置在MySQL安装软件中可用的引擎。如果你在使用一个预先包装好的MySQL二进制发布版软件,那么,这个软件就包含了常用的引擎。然而,需要指出的是,如果你要使用某些不常用的引擎,特别是CSV、RCHIVE(存档)和BLACKHOLE(黑洞)引擎,你就需要手工重新编译MySQL源码 。
使用一个指定的
|