MySql表 Innodb表和MyISAM表

Micah2015年08月13日 20:49 分类 : MySQL  > MySQL应用
阅读: 1810

分享到微信朋友圈

什么是MyISAM? MyISAM是MySQL关系数据库管理系统的默认储存引擎。它从旧的ISAM代码扩展出许多有用的功能。在新版本的MySQL中,InnoDB引擎由于其对事务,参照完整性,以及更高的并发性等优点开始广泛的取代MyISAM。
什么是MyISAM?
MyISAM是MySQL关系数据库管理系统的默认储存引擎。它从旧的ISAM代码扩展出许多有用的功能。在新版本的MySQL中,InnoDB引擎由于其对事务,参照完整性,以及更高的并发性等优点开始广泛的取代MyISAM。
每一个MyISAM表都对应于硬盘上的三个文件。这三个文件有一样的文件名,但是有不同的扩展名以指示其类型用途:.frm文件保存表的定义,但是这个文件并不是MyISAM引擎的一部,而是服务器的一部分;.MYD保存表的数据;.MYI是表的索引文件。

什么是InnoDB?
InnoDB是MySQL的另一个存储引擎,正成为目前MySQL AB所发行新版的标准,被包含在所有二进制安装包里。较之于其它的存储引擎它的优点是它支持兼容ACID的事务(类似于PostgreSQL),以及参数完整性(即对外键的支持)。
Oracle公司与2005年10月收购了Innobase。Innobase采用双认证授权。它使用GNU发行,也允许其它想将InnoDB结合到商业软件的团体获得授权。

InnoDB和MyISAM是mysql中最常用的两种表的类型,MyISAM是默认的类型。它们的区别很多,主要是侧重点不同,InnoDB支持一些高级处理,而MyISAM强调性能,当然强调性能的同时就要牺牲一些东西了。


代码:

CREATE TABLE  `Table1` (
  `id` int(11) NOT NULL,
  `name` char(50) character set ucs2 default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

CREATE TABLE  `Table2` (
  `id` int(11) NOT NULL,
  `name` char(50) character set ucs2 default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

然后随机的往这两张表中插入一些记录,比如都插入2条。

然后执行一下语句:


select count(*) from Table1
select count(*) from Table2

注意:这里的count(*)count(id)count(1)其实没有什么区别了,因为我们新建这张表时已经建好了主键,mysql和大多数的数据库引擎一样会做一些优化,它会去根据主键索引来统计。

以上的语句结果当然都是2。下面分析这两句话的执行过程:

explain select count(*) from Table1
explain select count(*) from Table2

得到的执行计划分别如下:

第一句:


+----+-------------+-------+------+---------------+------+---------+------+------+-----------
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                        |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------
|  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | Select tables optimized away | 
+----+-------------+-------+------+---------------+------+---------+------+------+-----------
第二句:
+----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table  | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | Table2 | index | NULL          | PRIMARY | 4       | NULL |    3 | Using index | 
+----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+
由此,我们能很明显的看出Table1是MyISAM类型的表,统计行数时它已经是最优的语句了( Select tables optimized away ,表示已经不能再优化了,一些资料上说MyISAM类型的表将Rows存在一个地方,查询时直接使用即可。)。Table2是InnoDB类型的表,统计行数时它将使用聚集索引进行统计。

InnoDB 跟磁盘相关的文件存储,可以分成两个部分,一个是日志文件,另一个是数据文件。当有频繁的 INSERT/UPDATE 操作的时候,InnoDB 需要分别写入这两个文件,日志文件是顺序操作,数据文件包括了表数据和索引数据两个部分(和 MyISAM 直接拆开成表文件和索引文件不同,InnoDB 的表和索引是在同一个文件当中的)。

InnoDB 的索引用的是 BTREE 格式,如果当前更新的记录影响到索引的变化,逻辑上就存在三个操作,从原来的 BTREE 找到并摘除原来这行的记录并做调整、插入行数据、根据新数据查找 BTREE 相应的位置并重新插入新索引信息,假设索引数为 N,相应的逻辑操作数就为 1 + 2*N,显然这些信息不能保证在同一个磁盘连续空间上,因此需要 1 + 2*N 次的磁头移动,行数越大、文件尺寸越大,磁头的移动幅度也就可能越大,带来的后果显然是极差的磁盘 IO 效率。

MySQL 对于 MyISAM 的的磁盘 IO 优化是如何建议的呢?使用符号链接将表文件和索引文件分别指向不同的不同的目录,分散到不同的磁盘上以增加系统的访问速度。这种优化方式,在 InnoDB 上完全没有可能性!

mySQL两种表存储结构MyISAM和InnoDB的性能比较测试
MyISAM 表。MyISAM 存储格式自版本 3.23 以来是 MySQL 中的缺省类型,它有下列特点:
■ 如果操作系统自身允许更大的文件,那么文件比 ISAM 存储方法的大。
■ 数据以低字节优先的机器独立格式存储。这表示可将表从一种机器拷贝到另一种机器,即使它们的体系结构不同也可以拷贝。
■ 数值索引值占的存储空间较少,因为它们是按高字节优先存储的。索引值在低位字节中变化很快,因此高位字节更容易比较。
■ AUTO_INCREMENT 处理比 ISAM 的表更好。详细内容在第2章讨论。
■ 减少了几个索引限制。例如,可对含 NULL 值的列进行索引,还可以对 BLOB 和 TEXT 类型的列进行索引。
■ 为了改善表的完整性检查,每个表都具有一个标志,在 myisamchk 对表进行过检查后,设置该标志。可利用 myisamchk - fast 跳过对自前次检查以来尚未被修改过表的检查,这样使此管理任务更快。表中还有一个指示表是否正常关闭的标志。如果服务器关闭不正常,或机器崩溃,此标志可用来检测出服务器起动时需要检查的表。

InnoDb 介绍:
InnoDb 存储引擎,支持事务,行锁,外键.InnoDb 设计用来处理大数据量时提供最好的
性能.
InnoDb 提供自己的缓存(buffer pool) 还缓存数据和索引.innodb 把数据和索引存放
到表空间(tablespace) ,表空间是几个磁盘文件或者是原是设备文件(raw disk). 它
不像MyISAM 存储引擎,每个表只是一个文件.(这样在某些系统下最大2G限制). 而Innodb
没有此限制,可以无限扩展.
Mysql4.0 的以后版本都支持innodb 存储.
InnoDb 配置:
innodb 管理的两个磁盘文件是表空间文件和日志文件.
表空间定义:
innodb_data_file_path=datafile_spec1[;datafile_spec2]...
文件声明格式: file_name:file_size[:autoextend[:max:max_file_size]]
innodb_data_home_dir 声明文件存放目录.

Micah
IT技术整理

精彩评论:0

还可以输入250个字 评论

评论成功

评论失败

推荐文章RECOMMEND
 

微信公众号

微博