您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

mysql存储引擎:myIsam和innodb的区别

2024/3/21 8:06:24发布28次查看
mysql有多种存储引擎,myisam和innodb是其中常用的两种。这里介绍关于这两种引擎的一些基本概念(非深入介绍)。
myisam是mysql的默认存储引擎,基于传统的isam类型,支持全文搜索,但不是事务安全的,而且不支持外键。每张myisam表存放在三个文件中:frm 文件存放表格定义;数据文件是myd (mydata);索引文件是myi (myindex)。
innodb是事务型引擎,支持回滚、崩溃恢复能力、多版本并发控制、acid事务,支持行级锁定(innodb表的行锁不是绝对的,如果在执行一个sql语句时mysql不能确定要扫描的范围,innodb表同样会锁全表,如like操作时的sql语句),以及提供与oracle类型一致的不加锁读取方式。innodb存储它的表和索引在一个表空间中,表空间可以包含数个文件。
核心区别
myisam是非事务安全型的,而innodb是事务安全型的。
myisam锁的粒度是表级,而innodb支持行级锁定。
myisam支持全文类型索引,而innodb不支持全文索引。
myisam相对简单,所以在效率上要优于innodb,小型应用可以考虑使用myisam。
myisam表是保存成文件的形式,在跨平台的数据转移中使用myisam存储会省去不少的麻烦。
innodb表比myisam表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename type=innodb)。
应用场景
myisam管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的select查询,那么myisam是更好的选择。
innodb用于事务处理应用程序,具有众多特性,包括acid事务支持。如果应用中需要执行大量的insert或update操作,则应该使用innodb,这样可以提高多用户并发操作的性能。
mysql的存储引擎和索引
数据库必须有索引,没有索引则检索过程变成了顺序查找,o(n)的时间复杂度几乎是不能忍受的。我们非常容易想象出一个只有单关键字组成的表如何使用b+树进行索引,只要将关键字存储到树的节点即可。当数据库一条记录里包含多个字段时,一棵b+树就只能存储主键,如果检索的是非主键字段,则主键索引失去作用,又变成顺序查找了。这时应该在第二个要检索的列上建立第二套索引。 这个索引由独立的b+树来组织。有两种常见的方法可以解决多个b+树访问同一套表数据的问题,一种叫做聚簇索引(clustered index ),一种叫做非聚簇索引(secondary index)。这两个名字虽然都叫做索引,但这并不是一种单独的索引类型,而是一种数据存储方式。对于聚簇索引存储来说,行数据和主键b+树存储在一起,辅助键b+树只存储辅助键和主键,主键和非主键b+树几乎是两种类型的树。对于非聚簇索引存储来说,主键b+树在叶子节点存储指向真正数据行的指针,而非主键。
innodb使用的是聚簇索引,将主键组织到一棵b+树中,而行数据就储存在叶子节点上,若使用where id = 14这样的条件查找主键,则按照b+树的检索算法即可查找到对应的叶节点,之后获得行数据。若对name列进行条件搜索,则需要两个步骤:第一步在辅助索引b+树中检索name,到达其叶子节点获取对应的主键。第二步使用主键在主索引b+树种再执行一次b+树检索操作,最终到达叶子节点即可获取整行数据。
myism使用的是非聚簇索引,非聚簇索引的两棵b+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引b+树的节点存储了主键,辅助键索引b+树存储了辅助键。表数据存储在独立的地方,这两颗b+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键检索无需访问主键的索引树。
为了更形象说明这两种索引的区别,我们假想一个表如下图存储了4行数据。其中id作为主索引,name作为辅助索引。图示清晰的显示了聚簇索引和非聚簇索引的差异。
我们重点关注聚簇索引,看上去聚簇索引的效率明显要低于非聚簇索引,因为每次使用辅助索引检索都要经过两次b+树查找,这不是多此一举吗?聚簇索引的优势在哪?
1 由于行数据和叶子节点存储在一起,这样主键和行数据是一起被载入内存的,找到叶子节点就可以立刻将行数据返回了,如果按照主键id来组织数据,获得数据更快。
2 辅助索引使用主键作为指针 而不是使用地址值作为指针的好处是,减少了当出现行移动或者数据页分裂时辅助索引的维护工作,使用主键值当作指针会让辅助索引占用更多的空间,换来的好处是innodb在移动行时无须更新辅助索引中的这个指针。也就是说行的位置(实现中通过16k的page来定位,后面会涉及)会随着数据库里数据的修改而发生变化(前面的b+树节点分裂以及page的分裂),使用聚簇索引就可以保证不管这个主键b+树的节点如何变化,辅助索引树都不受影响。
所以在百万级数据及更大数据情况下,mysql innodb 的索引表现更加优秀!
以上就是mysql存储引擎:myisam和innodb的区别的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product