5.3数据库存储引擎
存储引擎的概念是MySQL的特点,而且是一种插入式的存储引擎概念。这决定了 MySQL数据库中的表可以用不同的方式存储。用户可以根据自己的不同要求,选择不同 的存储方式、是否进行事务处理等。
【示例5-3】下面使用SHOW ENGINES语句可以查看Mysql数据库支持的存储引擎类型。查询方法如下:
SHOW ENGINES;
SHOW ENGINES语句可以用“;”结束,也可以使用“/g”或者“/G”结束。“/g”与“;”的作用相同,“/G”可以让结果显示更加美观。SHOW ENGINES语句查询的结果显示如下:
mysql>show engines \G *************************** 1. row *************************** Engine: MyISAM Support: YES Comment: Default engine as of MySQL 3.23 with great performance Transactions: NO XA: NO Savepoints: NO *************************** 2. row *************************** Engine: CSV Support: YES Comment: CSV storage engine Transactions: NO XA: NO Savepoints: NO *************************** 3. row *************************** Engine: MRG_MYISAM Support: YES Comment: Collection of identical MyISAM tables Transactions: NO XA: NO Savepoints: NO *************************** 4. row *************************** Engine: BLACKHOLE Support: YES Comment: /dev/null storage engine (anything you write to it disappears) Transactions: NO XA: NO Savepoints: NO *************************** 5. row *************************** Engine: FEDERATED Support: NO Comment: Federated MySQL storage engine Transactions: NULL XA: NULL Savepoints: NULL *************************** 6. row *************************** Engine: InnoDB Support: DEFAULT *************************** 1. row *************************** Engine: MyISAM Support: YES Comment: Default engine as of MySQL 3.23 with great performance Transactions: NO XA: NO Savepoints: NO *************************** 2. row *************************** Engine: CSV Support: YES Comment: CSV storage engine Transactions: NO XA: NO Savepoints: NO *************************** 3. row *************************** Engine: MRG_MYISAM Support: YES Comment: Collection of identical MyISAM tables Transactions: NO XA: NO Savepoints: NO *************************** 4. row *************************** Engine: BLACKHOLE Support: YES Comment: /dev/null storage engine (anything you write to it disappears) Transactions: NO XA: NO Savepoints: NO *************************** 5. row *************************** Engine: FEDERATED Support: NO Comment: Federated MySQL storage engine Transactions: NULL XA: NULL Savepoints: NULL *************************** 6. row *************************** Engine: InnoDB Support: DEFAULT
査询结果中,Engine参数指存储引擎名称;SUpport参数说明MySQL是否支持该类引擎,YES表示支持;Comment参数指对该引擎的评论;Transactions参数表示是否支持事 务处理,YES表示支持;XA参数表示是否分布式交易处理的XA规范,YES表示支持;Savepoints参数表示是否支持保存点,以便事务回滚到保存点,YES表示支持。
从查询结果中可以看出,MySQL支持的存储引擎包括MylSAM、MEMORY、InnoDB、 ARCHIVE和MRG_MYISAM等。其中InnoDB为默认(DEFAULT)存储引擎。
说明:MySQL 5.140安装时默认的存储引擎是InnoDB。如果通过图形界面安装MySQL时,选择Non-Transactional Database Only这个选项,那么MySQL的存储引擎将会是MyISAM。如果使用免安装的MySQL,其默认存储引擎是MyISAM。MySQL中另一个SHOW语句也可以显示支持的存储引擎。其代码如下:
SHOW VARIBLES LIKE 'HAVE%';
查询结果如下:
mysql> show variables like 'have%'; +-------------------------+----------+ | Variable_name | Value | +-------------------------+----------+ | have_community_features | YES | | have_compress | YES | | have_crypt | NO | | have_csv | YES | | have_dynamic_loading | YES | | have_geometry | YES | | have_innodb | YES | | have_ndbcluster | NO | | have_openssl | DISABLED | | have_partitioning | YES | | have_query_cache | YES | | have_rtree_keys | YES | | have_ssl | DISABLED | | have_symlink | YES | +-------------------------+----------+ 14 rows in set (0.05 sec)
查询结果中,第一列Varible_name表示存储引擎的名称,第二列Value表示MySQL的支持情况。YES表示支持,NO表示不支持,DISABLED表示支持但还没有开启。 Variable_name列有取值为have_innodb的记录,对应Value的值为YES,这表示支持InnoDB 存储引泰。
在创建表时,若没有指定存储引擎,表的存储引擎将为默认的存储引擎。
InnoDB存储引擎
InnoDB是MySQL数据库的一种存储引擎。InnoDB给NySQL的表提供了事务、回滚、崩溃修复能力和多版本并发控制的事务安全。在MySQL从3.23.34a开始包含lnnoDB存储引擎。InnoDB是MySQL上第一个提供外键约束的表引擎。而且InnoDB对事务处理的能力,也是mYsql其他存储引擎所无法与之比拟的。笔者安装的MySQL的默认存储引擎就是InnoDB。下文中将讲解lnnoDB存储引擎的特点及其优缺点
。
InnoDB存储引擎中支持自动增长列AUTO_INCREMENT。自动增长列的值不能为空, 且值必须唯一。MySQL中规定自增列必须为z主键。在插入值时,如果自动增长列不输入值,则插入的值为自动增长后的值;如果输入的值为0或空(NULL),则插入的值也为自动增长后的值;如果插入某个确定的值,且该值在前面没有出现过,则可以直接插入。
InnoDB存储引擎中支持外键(FOREIGNKEY)。外键所在的表为子表,外键所依赖的表为父表。父表中被子表外键关联的字段必须为主键。当删除、更新父表的某条信息时,子表也必须有相应的改变.
InnoDB存储引擎中,创建的表的表结构存储在.frm文件中。数据和索引存储在 innodb_data_home_dir 和 innodb_data_file_path 定义的表空间中。
InnoDB存储引擎的优势在于提&了良好的事务管理、崩溃修复能力和并发控制。缺点是其读写效率稍差,占用的数据空间相对比较大。
MyISAM
MyISAM存储引擎是MySQL中常见的存储引擎,曾是MySQL的默认存储引擎。 MyISAM存储引擎是基于ISAM存储引擎发展起来的。MyISAM增加了很多有用的扩展。 本小节将讲解MyISAM存储引擎的文件类型、存储格式和优缺点。
MyISAM存储引擎的表存储成3个文件。文件的名字与表名相同。扩展名包括frm、 MYD和MYI。其中,frm为扩展名的文件存储表的结构;MYD为扩展名的文件存储数据, 其是MYData的缩写; MYI为扩展名的文件存储索引,其是MYIndex的缩写。
基于MyISAM存储引擎的表支持3种不同的存储格式。包括静态型、动态型和压缩型。 其中,静态型为MyISAM存储引擎的默认存储格式,其字段是固定长度的;动态型包含变 长字段,记录的长度不是固定的;压缩型需要使用myisampack工具创建,占用的磁盘.空间较小。
MyISAM存储引擎的优势在于占用空间小,处理速度快。缺点是不支持事务的完整性 和并发性。
MEMORY
MEMORY存储引擎是MySQL中的一类特殊的存储引擎。其使用存储在内存中的内容来创建表,而且所有数据也放在内存中。这些特性都与InnoDB存储引擎、MyISAM存储储引擎不同。下面将讲解MEMORY存储引擎的文件存储形式、索引类型、存储周期和优 缺点。
每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。该文件中只存储表的结构。而其数据文件,都是存储在内存中。这样有利于对数据的快速的处理,提高整个表的处理效率。值得注意的是,服务器需要有足够的内存来维持MEMORY存储引擎的表的使用。如果不需要使用了,可以释放这些内存, 甚至可以删除不需要的表。MEMORY存储引擎默认使用哈希(HASH)索引。其速度要比使用8型树(BTREE) 索引快。如果读者希望使用8型树索引,可以在创建索引时选择使用。
技巧:MEMORY存储引擎通常很少用到。因为MEMORY表的所有数据是存储在内存上的,如果内存出现异常就会影响到数据的完整性。如果重启机器或者关机,表中的所有数据将消失。因此,基于MEMORY存储引擎的表的生命周期很短,一般都是一次性的。MEMORY表的大小是受到限制的。表的大小主要取决于两个参数,分别是max一rows 和max_heap一table__size。其中max_rows可以在创建表时指定;max_heap一table__size的大小默认为16MB,可以按需要进行扩大。因此,其存在于内存中的特性,这类表—的处理速度非常快。但是,其数据易丢失,生命周期短。基于其这个缺陷,选择MEMARY存储引擎时需要特别小心。
存储引擎的选择
在实际工作中,选择一个合适的存储引擎是一个很复杂的问题。每种存储引擎都有各 自的优势,不能笼统的说谁比谁更好。本小节将对各个存储引擎的特点进行对比,给出不 同情况下选择存储引擎的建议。
下面从存储引擎的事务安全、存储限制、空间使用、内存使用、插入数据的速度和对 外键的支持这几个角度做一个比较,如表5.1所示:
特性 | InnoDB | MyISAM | MEMORY |
---|---|---|---|
事务安全 | 支持 | 无 | 无 |
存储限制 | 64TB | 有 | 有 |
空间使用 | 高 | 低 | 低 |
内存使用 | 高 | 低 | 高 |
插入数据速度 | 低 | 高 | 高 |
对外键的支持 | 支持 | 无 | 无 |
表5.1中介绍了InnoDB、MyISAM、MEMORY这3种存储引擎特性的对比。下面根据其不同的特性,给出选择存储引擎的建议。
InnoDB存储引擎:lnnoDB存储引擎支持事务处理,支持外键。同时支持崩溃修 复能力和并发控制。如果需要对事务的完整性要求比较高,要求实现并发控制, 那选择InnoDB存储引擎有其很大的优势。如果需要频繁的进行更新、删除操作的 数据库,也可以选择InnoDB存储引擎。因为该类存储引擎可以实现事务的提交 (Commit)和回滚(Rollback)。
MyISAM存储引擎:MyISAM存储引擎的插入数据快,空间和内存使用比较低。 如果表主要是用于插入新纪录和读出记录,那么选择MyISAM存储引擎能实现处 理的高效率。如果应用的完整性、并发性要求很低,也可以选择MyISAM存储引擎.
MEMORY存储引擎:MEMORY存储引擎的所有数据都在内存中,数据的处理速度快,但安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可 以选择MEMORY存储引擎。MEMORY存储引擎对表的大小有要求,不能建立太 大的表。所以,这类数据库只使用与相对较小的数据库表。
这些选择存储引擎的建议都是根据不同存储引擎的特点提出的。这些建议方案并不是 绝对的。实际应用中还需要根据实际情况进行分析。
技巧:同一个数据库中可以使用多种存储引擎的表。如果一个表要求较高的事务处理, 可以选择InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储 引擎。如果需要该数据库中需要一个用于查询的临时表,可以选择MEMORY存 储引擎。