十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这期内容当中的小编将会给大家带来有关MySQL中InnoDB与MyISAM的区别,以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
在天门等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站制作、成都网站设计 网站设计制作按需网站策划,公司网站建设,企业网站建设,品牌网站制作,全网整合营销推广,成都外贸网站建设公司,天门网站建设费用合理。
InnoDB存储引擎
InnoDB,是MySQL的数据库引擎之一,现为MySQL的默认存储引擎,为MySQL AB发布binary的标准之一。InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能,类似于PostgreSQL。
InnoDB 给 MySQL 提供了具有事务(transaction)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)、多版本并发控制(multi-versioned concurrency control)的事务安全(transaction-safe (ACID compliant))型表。
MyISAM存储引擎
MyISAM是默认存储引擎(Mysql5.1前)。它基于更老的ISAM代码,但有很多有用的扩展。(注意MySQL 5.1不支持ISAM)。 每个MyISAM在磁盘上存储成三个文件,每一个文件的名字均以表的名字开始,扩展名指出文件类型。
InnoDB和MyISAM的区别
事务
为了数据库操作的原子性,我们需要事务。保证一组操作要么都成功,要么都失败,比如转账的功能。我们通常将多条SQL
语句放在begin
和commit
之间,组成一个事务。
InnoDB
支持,MyISAM
不支持。
索引
为了优化查询的速度,进行排序和匹配查找,我们需要索引。比如所有人的姓名从a-z
首字母进行顺序存储,当我们查找zhangsan
或者第44
位的时候就可以很快的定位到我们想要的位置进行查找。
InnoDB
是聚集索引,数据和主键的聚集索引绑定在一起,通过主键索引效率很高。如果通过其他列的辅助索引来进行查找,需要先查找到聚集索引,再查询到所有数据,需要两次查询。
MyISAM
是非聚集索引,数据文件是分离的,索引保存的是数据的指针。
从InnoDB 1.2.x
版本,MySQL5.6
版本后,两者都支持全文索引。
auto_increment
自增
对于自增数的字段,InnoDB
要求该列必须是索引,同时必须是索引的第一个列,否则会报错:
mysql> create table test( -> a int auto_increment, -> b int, -> key(b,a) -> ) engine=InnoDB; ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
把(b,a)
顺序替换为(a,b)
即可。
而MyISAM
可以将该字段与其他字段随意顺序组成成联合索引。
表行数
很常见的需求是看表中有多少条数据,此时我们需要select count(*) from table_name
。
InnoDB
不保存表行数,需要进行全表扫描。MyISAM
用一个变量保存,直接读取该值,更快。当时当带有where
查询的时候,两者一样。
存储
数据库的文件都是需要在磁盘中进行存储,当应用需要时再读取到内存中。一般包含数据文件、索引文件。
InnoDB
分为:
.frm
表结构文件.ibdata1
共享表空间.ibd
表独占空间.redo
日志文件MyISAM
分为三个文件:
.frm
存储表定义.MYD
存储表数据.MYI
存储表索引主键
由于InnoDB
的聚集索引,其如果没有指定主键,就会自动生成主键。MyISAM
支持没有主键的表存在。
外键
为了解决复杂逻辑的依赖,我们需要外键。比如高考成绩的录入,必须归属于某位同学,我们就需要高考成绩数据库里有准考证号的外键。
InnoDB
支持,MyISAM
不支持。
执行速度
如果你的操作是大量的查询操作,如SELECT
,使用MyISAM
性能会更好。
如果大部分是删除和更改的操作,使用InnoDB
。
InnoDB
和MyISAM
的索引都是B+
树索引,通过索引可以查询到数据的主键,不熟悉B+
树的可以查看MySQL InnoDB索引原理和算法。两者的性能区别主要在于查询到数据主键后两者的处理方式却不同。
InnoDB
会缓存索引和数据文件,一般以16KB
为一个最小单元(数据页大小)和磁盘进行交互,InnoDB
在查询到索引数据后实际得到的是主键的ID
,它需要在内存中的数据页中查找该行的全部数据,但如果该数据不是加载过的热数据,还需要进行数据页的查找和替换,这其中可能牵涉到多次I/O
操作和内存中数据查找,导致耗时较高。
而MyISAM
存储引擎只缓存索引文件,不缓存数据文件,其数据文件的缓存直接使用操作系统的缓存,这点非常独特。此时相同的空间能够加载更多的索引,因此当缓存空间有限时,MyISAM
的索引数据页替换次数会更少。根据前面我们知道MyISAM
的文件分为MYI
和MYD
,当我们通过MYI
查找到主键ID
时,其实得到是MYD
数据文件的offset
偏移量,查找数据比InnoDB
寻址映射要快的多。
但由于MyISAM
是表锁,而InnoDB
支持行锁,因此在牵涉到大量写操作时,InnoDB
的并发性能比MyISAM
好很多。同时InnoDB
还通过MVVC
多版本控制来提高并发读写性能。
delete
删除数据
调用delete from table
时,MyISAM
会直接重建表,InnoDB
会一行一行的删除,但是可以用truncate table
代替。参考: mysql清空表数据的两种方式和区别。
锁
MyISAM
仅支持表锁,每次操作锁定整张表。InnoDB
支持行锁,每次操作锁住最小数量的行数据。
表锁相比于行锁消耗的资源更少,且不会出现死锁,但同时并发性能差。行锁消耗更多的资源,速度较慢,且可能发生死锁,但是因为锁定的粒度小、数据少,并发性能好。如果InnoDB
的一条语句无法确定要扫描的范围,也会锁定整张表。
当行锁发生死锁的时候,会计算每个事务影响的行数,然后回滚行数较少的事务。
数据恢复
MyISAM
崩溃后无法快速的安全恢复。InnoDB
有一套完善的恢复机制。
数据缓存
MyISAM
仅缓存索引数据,通过索引查询数据。InnoDB
不仅缓存索引数据,同时缓存数据信息,将数据按页读取到缓存池,按LRU(Latest Rare Use 最近最少使用)
算法来进行更新。
如何选择存储引擎
创建表的语句都是相同的,只有最后的type
来指定存储引擎。
MyISAM
1、大量查询总count
2、查询频繁,插入不频繁
3、没有事务操作
InnoDB
1、需要高可用性,或者需要事务
2、表更新频繁
上述就是小编为大家分享的MySQL中InnoDB与MyISAM的区别了,如果您也有类似的疑惑,不妨碍参照上述分析进行理解。如果想了解更多相关内容,请关注创新互联行业资讯。