innodb和myisam的区别及索引实现原理

本文介绍了MySQL中InnoDB和MyISAM两种引擎的主要区别,重点讨论了它们的索引实现原理。MyISAM使用非聚集索引,索引文件独立存储数据地址,而InnoDB采用聚集索引,索引本身就包含数据,导致主键查询高效,辅助索引查询相对较慢。
innodb和myisam是Mysql中常用的两种引擎,以下是两者的比较:
innodbmyisam
对事务的支持支持四种事务的隔离级别不支持
支持的锁种类行锁、页锁、表锁表锁
是否支持全文索引不支持支持
索引聚集索引非聚集索引
并发根据事务隔离级别读写互相阻塞
储存基于磁盘的资源是InnoDB表空间数据文件和它的日志文件在磁盘中储存成三个文件,分别是:索引文件、数据文件、表定义
使用场景事务要求高,对数据大量的修改操作…事务要求不高,查询操作多、并发低…

下面看一下两者的索引实现的原理:

myisam:非聚集索引

采用B+树的数据索引结构
索引作为单独的文件储存起来,记录了数据的存放地址

在这里插入图片描述
上图以表的Col1字段作为主键,可以看出索引文件里储存的是数据主键的地址

innodb:聚集索引

采用B+树的数据索引结构:
与myisam不同的是,索引的本身就是数据的一部分,因此,每一个叶子节点都储存了完整的数据

主索引的查询:select * from user where id=?
在这里插入图片描述
辅助索引的查询:select * from user where name=?
实际上它首先是根据辅助索引查询到子节点中与辅助索引绑定的主索引,再根据主索引查询相当于执行了select * from user where id=(select id from user where name=?);
所以在innodb表中,当我们按主键查询时效率很高,但使用辅助索引的话效率就会很低;
在这里插入图片描述

### InnoDBMyISAM 索引实现机制区别 InnoDB MyISAM索引实现上采用了不同的策略,这直接影响了它们在数据存储查询性能方面的表现。 #### 聚簇索引 vs 非聚簇索引 InnoDB 使用聚簇索引(Clustered Index),这意味着数据行是按照主键索引的顺序存储的。每个 InnoDB 表都有一个特殊的索引,称为聚簇索引,它决定了数据在磁盘上的物理存储方式。如果表有一个主键,那么这个主键就是聚簇索引。如果没有定义主键,InnoDB 会尝试使用一个唯一的非空索引作为替代,或者系统会自动生成一个隐藏的聚簇索引[^3]。 相比之下,MyISAM 使用的是非聚簇索引(Non-clustered Index)。在 MyISAM 中,数据文件索引文件是分开存储的。每个表的数据存储在一个 `.MYD` 文件中,而索引则存储在 `.MYI` 文件中。MyISAM索引结构并不影响数据行的物理存储顺序,而是通过索引文件中的指针来指向数据文件中的记录位置[^4]。 #### 主键索引辅助索引InnoDB 中,主键索引(Primary Key)是聚簇索引的一部分,因此访问主键索引可以直接定位到数据行。对于辅助索引(Secondary Index),InnoDB 存储的是主键值而不是数据行的物理地址。当通过辅助索引来查找数据时,InnoDB 需要先找到对应的主键值,然后使用主键索引来访问实际的数据行。这种方式保证了即使数据行的位置发生变化(如页分裂),也不需要更新所有相关的辅助索引条目。 而在 MyISAM 中,无论是主键索引还是辅助索引,都指向数据文件中的记录偏移量。MyISAM 的主键索引辅助索引之间没有本质的区别,除了主键索引要求唯一性非空性。这种设计使得 MyISAM 在某些情况下可以更快地访问数据,因为它可以直接根据索引中的指针定位到数据行的物理位置[^4]。 #### 索引构建维护 InnoDB索引构建通常涉及更多的 I/O 操作,因为数据行需要按照主键排序,并且可能需要重新组织数据页以保持聚簇索引的有效性。此外,由于 InnoDB 支持事务行级锁定,索引的更新也需要遵循 ACID 属性,这可能导致更高的开销。但是,这些特性也提高了并发性能数据一致性[^3]。 MyISAM索引构建相对简单,因为数据行的物理位置不会因为索引的变化而改变。这使得 MyISAM 在插入新记录时通常比 InnoDB 更快,尤其是在没有频繁更新的情况下。然而,在高并发写入场景下,MyISAM 的表级锁定机制可能会成为瓶颈,因为它会导致其他写操作等待当前操作完成[^4]。 #### 性能差异 对于全表扫描或全索引扫描的操作,InnoDB 由于其聚簇索引的设计,通常能够提供更好的性能,因为它减少了磁盘 I/O 操作的次数。而 MyISAM 的非聚簇索引则可能需要更多的 I/O 操作来读取数据文件中的记录。 另一方面,当执行 `SELECT COUNT(*)` 查询时,MyISAM 可以利用其内部维护的行数计数器快速返回结果,而 InnoDB 必须对表进行全表扫描才能得到准确的行数。 ```sql -- 创建 MyISAM 引擎的表 CREATE TABLE myisam_table ( id INT PRIMARY KEY, name VARCHAR(11) NOT NULL ) ENGINE=MyISAM; -- 创建 InnoDB 引擎的表 CREATE TABLE innodb_table ( id INT PRIMARY KEY, name VARCHAR(11) NOT NULL ) ENGINE=InnoDB; ``` 综上所述,InnoDB MyISAM索引实现上的技术差异主要体现在聚簇索引与非聚簇索引的选择、主键辅助索引的处理以及索引构建维护的方式上。选择合适的存储引擎应基于具体的应用需求,考虑事务支持、并发性能、数据完整性查询模式等因素。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值