Mysql常用的几种的引擎以及性能介绍

      mysql支持多种存储引擎,在处理不同类型的应用时,可以通过选择使用不同的存储引擎提高应用的效率,或者提供灵活的存储。mysql的存储引擎包括:MyISAM、 InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDB Cluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等,其中InnoDB和BDB提供事务安全表,其他存储引擎都是非事务安全表。以下介绍常用的几种引擎以及他们的性能。

1、常用引擎介绍

InnoDB

给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在 SELECT语句提供一个Oracle风格一致的非锁定读。这些特色增加了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中 行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。


MySQL innodb存储引擎使用与oracle相同的行锁机制,对如何查看系统中存在的行锁情况在下面的实验中,将可以看到。下面是测试过程:
session 1:更新记录

mysql> set autocommit=off;
Query OK, 0 rows affected (0.01 sec)

mysql> update t1 set email='[email protected]' where id=0;
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4 Changed: 4 Warnings: 0

session 2也更新相同的记录,出现等待

mysql> set autocommit=off;
Query OK, 0 rows affected (0.00 sec)

mysql> update t1 set email='abc' where id=0;
session 3:查看系统等待事件:

mysql> show status like '%lock%';
+-------------------------------+---------+
| Variable_name | Value |
| Innodb_row_lock_current_waits | 1 | --这里
|14 rows in set (0.01 sec)
session 1:提交记录

mysql> commit;
Query OK, 0 rows affected (0.01 sec)
session 2:update立刻完成

mysql> update t1 set email='abc' where id=0;
Query OK, 4 rows affected (2 min 43.44 sec)
Rows matched: 4 Changed: 4 Warnings: 0
session 3:再次查看系统等待事件

mysql> show status like '%lock%';
+-------------------------------+---------+
| Variable_name | Value |
| Innodb_row_lock_current_waits | 0 | --这里为0
|14 rows in set (0.01 sec)
查询会话session 1,session 2的连接ID

session 1:
mysql> status;
--------------
mysql Ver 12.22 Distrib 4.0.24, for pc-solaris2.10 (i386)

Connection id: 15

session 2:
mysql> status;
--------------
mysql Ver 12.22 Distrib 4.0.24, for pc-solaris2.10 (i386)

Connection id: 13
在上面的session 1尚没有提交的时候,可以执行下列命令,查看一些事务阻塞信息

mysql> show innodb status\G;
------------
TRANSACTIONS
------------
Trx id counter 0 3852351
Purge done for trx's n:o < 0 3852350 undo n:o < 0 0
History list length 11
Total number of lock structs in row lock hash table 7
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0 0, not started, OS thread id 15
MySQL thread id 18, query id 2071119 localhost root
show innodb status
---TRANSACTION 0 3852350, ACTIVE 6 sec, OS thread id 14 starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 320
MySQL thread id 13, query id 2071118 localhost test Updating --这里可以看到等待者
update t1 set email='abc' where id=0 --这里可以看到等待者正在执行的SQL
-------
------------------
---TRANSACTION 0 3852348, ACTIVE 391 sec, OS thread id 12
7 lock struct(s), heap size 1024, undo log entries 4
MySQL thread id 15, query id 2071117 localhost test
当出现行锁时,谁等待谁?在哪里得到此信息,由于mysql采用的是线程机制,如何kill阻塞者,不知道在Mysql数据库里怎么操作?

MyISAM

MySQL支持数个存储引擎作为对不同表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理 非事务安全表的引擎:· MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置 MySQL默认使用另外一个引擎。

如果使用myisam你将失去事务和外键功能,切忌。

但它是速度要超过innodb.

ISAM
ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MySQL能够支持这样的备份应用程序。

HEAP
HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和 MyISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费 大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格。让我再重复一遍:在你用完 表格之后,不要忘记删除表格。

在很多的mysql tool中没有这种数据引擎的支持。
 2、引擎性能介绍

 

最常使用的2 种存储引擎:

1. Myisam是Mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用Myisam。每个MyISAM在磁盘上存储成三个文件。文件名都和表名相同,扩展名分别是.frm(存储表定义)、.MYD (MYData,存储数据)、.MYI (MYIndex,存储索引)。数据文件和索引文件可以放置在不同的目录,平均分布io,获得更快的速度。

2. InnoDB 存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比Myisam的存储引擎,InnoDB 写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

3、如何选择合适的存储引擎

选择标准: 根据应用特点选择合适的存储引擎,对于复杂的应用系统可以根据实际情况选择多种存储引擎进行组合.

下面是常用存储引擎的适用环境:

1. MyISAM:默认的MySQL 插件式存储引擎,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一

2. InnoDB:用于事务处理应用程序,具有众多特性,包括ACID 事务支持。

3. Memory:将所有数据保存在RAM 中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。

4. Merge:允许MySQL DBA 或开发人员将一系列等同的MyISAM 表以逻辑方式组合在一起,并作为1 个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。


 

 

你可能感兴趣的:(database)