共计 3738 个字符,预计需要花费 10 分钟才能阅读完成。
MySQL 存储引擎之 MyIsam 和 Innodb 详情
区别 | MyISAM | InnoDB |
构成上的区别: | 每个 MyISAM 在磁盘上存储成三个文件。第一个 文件的名字以表的名字开始,扩展名指出文件类型。 .frm 文件存储表定义。 数据文件的扩 展名为.MYD (MYData)。 索引文件的扩 展名是.MYI (MYIndex)。 | 基于磁盘的资源是 InnoDB 表空间数据文件和它的日志文件,InnoDB 表的 大小只受限于操作系统文件的大小,一般为 2GB |
事务处理上方面: | MyISAM 类型的表强调的是性能,其执行数 度比 InnoDB 类型更快,但是不提供事务支持 | InnoDB 提供事务支持事务,外部键等高级 数据库功能 |
SELECT UPDATE INSERT Delete | 如果执行大量的 SELECT,MyISAM 是更好的选择 | 1. 如果你的数据执行大量的 INSERT 或 UPDATE,出于性能方面的考虑,应该使用 InnoDB 表 2.DELETE FROM table 时,InnoDB 不会重新建立表,而是一行一行的 删除。 3.LOAD TABLE FROM MASTER 操作对 InnoDB 是不起作用的,解决方法是首先把 InnoDB 表改成 MyISAM 表,导入数据后再改成 InnoDB 表,但是对于使用的额外的 InnoDB 特性(例如外键)的表不适用 |
对 AUTO_INCREMENT 的 操作
| 每表一个 AUTO_INCREMEN 列的内部处理。 MyISAM 为 INSERT 和 UPDATE 操 作自动更新这一列。这使得 AUTO_INCREMENT 列更快(至少 10%)。在序列顶的值被删除之后就不 能再利用。(当 AUTO_INCREMENT 列被定义为多列索引的最后一列,可以出现重使用从序列顶部删除的值的情况)。 AUTO_INCREMENT 值可用 ALTER TABLE 或 myisamch 来重置 对于 AUTO_INCREMENT 类型的字段,InnoDB 中必须包含只有该字段的索引,但 是在 MyISAM 表中,可以和其他字段一起建立联 合索引 更好和更快的 auto_increment 处理 | 如果你为一个表指定 AUTO_INCREMENT 列,在数据词典里的 InnoDB 表句柄包含一个名为自动增长计数 器的计数器,它被用在为该列赋新值。
自动增长计数 器仅被存储在主内存中,而不是存在磁盘上 关于该计算器 的算法实现,请参考 AUTO_INCREMENT 列 在 InnoDB 里 如何工作 |
表的具体行数 | select count(*) from table,MyISAM 只要简单的读出保存好的行数,注意的是,当 count(*) 语句包含 where 条件时,两种表的操作是一样的 | InnoDB 中不 保存表的具体行数,也就是说,执行 select count(*) from table 时,InnoDB 要扫描一遍整个表来计算有多少行 |
锁 | 表锁 | 提供行锁 (locking on row level),提供与 Oracle 类型一致的不加锁读取 (non-locking read in SELECTs),另外,InnoDB 表的行锁也不是绝对的,如果在执 行一个 SQL 语句时 MySQL 不能确定要扫描的范围,InnoDB 表同样会锁全表,例如 update table set num=1 where name like “%aaa%” |
MySQL 存储引擎 MyISAM 与 InnoDB 如何选择
MySQL 有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。
虽然 MySQL 里的存储引擎不只是 MyISAM 与 InnoDB 这两个,但常用的就是两个。
两种存储引擎的大致区别表现在:
1)InnoDB 支持事务,MyISAM 不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而 MyISAM 就不可以了。
2)MyISAM 适合查询以及插入为主的应用,InnoDB 适合频繁修改以及涉及到安全性较高的应用
3)InnoDB 支持外键,MyISAM 不支持
4)从 MySQL5.5.5 以后,InnoDB 是默认引擎
5)InnoDB 不支持 FULLTEXT 类型的索引
6)InnoDB 中不保存表的行数,如 select count(*) from table 时,InnoDB 需要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。注意的是,当 count(*) 语句包含 where 条件时 MyISAM 也需要扫描整个表
7)对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中可以和其他字段一起建立联合索引
8)清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建表
9)InnoDB 支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like ‘%lee%’
关于 MyISAM 与 InnoDB 选择使用:
MYISAM 和 INNODB 是 Mysql 数据库提供的两种存储引擎。两者的优劣可谓是各有千秋。INNODB 会支持一些关系数据库的高级功能,如事务功能和行级锁,MYISAM 不支持。MYISAM 的性能更优,占用的存储空间少。所以,选择何种存储引擎,视具体应用而定:
1)如果你的应用程序一定要使用事务,毫无疑问你要选择 INNODB 引擎。但要注意,INNODB 的行级锁是有条件的。在 where 条件没有使用主键时,照样会锁全表。比如 DELETE FROM mytable 这样的删除语句。
2)如果你的应用程序对查询性能要求较高,就要使用 MYISAM 了。MYISAM 索引和数据是分开的,而且其索引是压缩的,可以更好地利用内存。所以它的查询性能明显优于 INNODB。压缩后的索引也能节约一些磁盘空间。MYISAM 拥有全文索引的功能,这可以极大地优化 LIKE 查询的效率。
有人说 MYISAM 只能用于小型应用,其实这只是一种偏见。
如果数据量比较大,这是需要通过升级架构来解决,比如分表分库,而不是单纯地依赖存储引擎。
现在一般都是选用 innodb 了,主要是 myisam 的全表锁,读写串行问题,并发效率锁表,效率低 myisam 对于读写密集型应用一般是不会去选用的。
关于 Mysql 数据库默认的存储引擎:
MyISAM 和 InnoDB 是 MySQL 的两种存储引擎。
如果是默认安装,那就应该是 InnoDB,你可以在 my.cnf 文件中找到 default-storage-engine=INNODB;
当然你可以在建表时指定相应的存储引擎。
通过 show create table xx 可以看见相应信息。
Mysql 中 InnoDB 和 MyISAM 的比较
1)MyISAM:
每个 MyISAM 在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm 文件存储表定义。数据文件的扩展名为.MYD (MYData)。
MyISAM 表格可以被压缩,而且它们支持全文搜索。不支持事务,而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。在进行 updata 时进行表锁,并发量相对较小。如果执行大量的 SELECT,MyISAM 是更好的选择。
MyISAM 的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而 Innodb 是索引和数据是紧密捆绑的,没有使用压缩从而会造成 Innodb 比 MyISAM 体积庞大不小
MyISAM 缓存在内存的是索引,不是数据。而 InnoDB 缓存在内存的是数据,相对来说,服务器内存越大,InnoDB 发挥的优势越大。
优点:查询数据相对较快,适合大量的 select,可以全文索引。
缺点:不支持事务,不支持外键,并发量较小,不适合大量 update
2)InnoDB:(参数说明:Mysql 存储引擎之 Innodb 重要参数说明)
这种类型是事务安全的。. 它与 BDB 类型具有相同的特性, 它们还支持外键。InnoDB 表格速度很快。具有比 BDB 还丰富的特性, 因此如果需要一个事务安全的存储引擎,建议使用它。在 update 时表进行行锁,并发量相对较大。如果你的数据执行大量的 INSERT 或 UPDATE,出于性能方面的考虑,应该使用 InnoDB 表。
优点:支持事务,支持外键,并发量较大,适合大量 update
缺点:查询数据相对较快,不适合大量的 select
对于支持事物的 InnoDB 类型的表,影响速度的主要原因是 AUTOCOMMIT 默认设置是打开的,而且程序没有显式调用 BEGIN 开始事务,导致每插入一条都自动 Commit,严重影响了速度。可以在执行 sql 前调用 begin,多条 sql 形成一个事物(即使 autocommit 打开也可以),将大大提高性能。
基本的差别为:
MyISAM 类型不支持事务处理等高级处理,而 InnoDB 类型支持。
MyISAM 类型的表强调的是性能,其执行数度比 InnoDB 类型更快,但是不提供事务支持,而 InnoDB 提供事务支持已经外部键等高级数据库功能。
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-10/147875.htm