InnoDB和MYISAM

本文探讨了MySQL中两种主流存储引擎InnoDB与MyISAM的区别。MyISAM适用于大量SELECT与INSERT操作,不支持事务及外键;InnoDB支持事务安全、行级锁定与外键,适合高并发与大量UPDATE、INSERT场景。

InnoDB和MYISAM的差别

为什么建表时的数据库引擎要用InnoDB 而不用MYISAM

MyISAM:默认表类型,他是基于传统的SAM类型,ISAM是Indexed Sequential Access Method (有索引的順序访问方法) 的缩写,
它是存储记录和文件的标准方法。不是事务安全的,而且不支持外鍵,如果执行大量的select,insert MyISAM比较合适。
InnoDB:支持事务安全的引擎,支持外鍵、行锁、事务是他的最大特点。如果有大量的update和insert,建议使用InnoDB,特別是针对多个并发和QPS(每秒查询率/每秒请求率 服务器每秒处理了多少个请求)较高的情況。
MYISAM 是只支持表级锁 比如就同一个表在进行修改同一行数据(*)操作时另外一个线程是没办法修改的 需要等第一个线程执行完才可以 当然如果不是修改同一行数据就没关系,
当然select也是一样会锁,但是读取性能非常高。

<think> 我们参考了多个引用片段,总结InnoDBMyISAM的主要区别如下: 1. **存储结构**: - MyISAM:每个在磁盘上存储成三个文件:.frm(结构定义)、.MYD(数据文件)、.MYI(索引文件)。索引数据是分开存储的,索引采用非聚簇索引,索引的叶子节点存储的是指向数据所在地址的指针[^2][^3]。 - InnoDB:每个在磁盘上存储成两个文件:.frm(结构定义)、.ibd(存储数据索引)。数据索引是紧密捆绑的,采用聚簇索引,索引的叶子节点直接存储数据[^2][^3]。 2. **事务支持**: - InnoDB支持事务(ACID特性),而MyISAM不支持事务[^1][^2][^4]。 3. **锁机制**: - MyISAM只支持级锁,在执行写操作(如INSERT、UPDATE、DELETE)时需要锁定整个,这会导致并发性能较差[^1][^2][^4]。 - InnoDB支持行级锁(默认)级锁。行级锁只在操作行上加锁,其他行不受影响,因此在高并发写操作场景下性能更好[^1][^2][^4]。注意:如果SQL语句没有使用索引,InnoDB会退化为级锁[^4]。 4. **外键支持**: - InnoDB支持外键约束,而MyISAM不支持[^2][^4]。 5. **的具体行数统计**: - MyISAM内部维护了一个计数器,存储了的总行数,当执行`SELECT COUNT(*) FROM table`(不带WHERE条件)时,可以直接返回该值,速度非常快[^5]。 - InnoDB不保存的具体行数,执行相同的语句时需要全扫描统计行数,效率较低[^5]。 6. **存储空间压缩**: - MyISAM支持压缩,存储空间占用相对较小[^3]。 - InnoDB需要更多的内存存储空间,因为它会在主内存中立缓冲池来缓存数据索引[^2]。 7. **索引类型**: - MyISAM支持FULLTEXT(全文)索引(但在旧版本中InnoDB不支持,5.6版本开始支持)[^4]。 - 对于AUTO_INCREMENT类型的字段,在旧版本中,InnoDB要求该字段必须单独立索引,而MyISAM可以其他字段一起立联合索引[^4]。 8. **崩溃恢复**: - InnoDB具有崩溃恢复能力,支持事务日志(redo log)来保证数据的一致性。而MyISAM在崩溃后数据损坏的概率更高,恢复困难[^2]。 9. **性能**: - 对于大量查询操作,MyISAM通常更快,因为它的结构简单[^2]。 - 对于有写操作(尤其并发写)事务的场景,InnoDB性能更好。 **如何选择存储引擎?** 根据应用场景: - 需要事务支持、高并发写操作、外键约束、崩溃恢复能力,选择InnoDB。 - 如果主要是只读操作(如数据仓库、日志分析等),且对事务没有要求,可以选择MyISAM。但注意,由于MyISAM不支持行级锁事务,在并发写操作多的情况下性能会下降。 目前,MySQL从5.5版本开始默认使用InnoDB存储引擎,这也反映了InnoDB在大多数应用场景中的优势。 相关问题: 1. 在哪些具体场景下应该选择MyISAM而不是InnoDB? 2. InnoDB的行级锁是如何实现的? 3. 如何将MyISAM转换为InnoDB?转换时需要注意哪些问题? 请注意,虽然MyISAM在某些查询场景下可能更快,但随着InnoDB的不断优化,差距已经缩小,而且InnoDB提供了更好的数据完整性并发性能,因此一般议使用InnoDB。 </think> ### InnoDBMyISAM的核心区别 #### 一、存储结构与索引机制 | **特性** | **InnoDB** | **MyISAM** | |----------------|---------------------------------------|--------------------------------------| | **存储文件** | `.frm`(定义) + `.ibd`(数据与索引)[^2] | `.frm` + `.MYD`(数据) + `.MYI`(索引)[^2] | | **索引类型** | **聚簇索引**:数据与索引绑定,叶子节点直接存数据[^1] | **非聚簇索引**:索引存地址指针,数据独立存储[^1][^3] | | **索引压缩** | 不支持 | 支持压缩索引,内存利用率更高[^3] | | **空间占用** | 较大(数据索引一体)[^3] | 较小(支持压缩)[^2] | #### 二、事务与并发控制 | **特性** | **InnoDB** | **MyISAM** | |------------------|---------------------------------------|------------------------| | **事务支持** | ✅ ACID事务,崩溃恢复能力强[^1][^4] | ❌ 不支持事务[^1][^2] | | **锁机制** | 行级锁(默认),支持级锁[^1][^4] | 仅级锁[^1][^2] | | **并发性能** | 高并发写场景更优 | 高并发读场景更优[^2] | #### 三、功能与性能特性 | **特性** | **InnoDB** | **MyISAM** | |----------------------|-------------------------------------|--------------------------------| | **外键支持** | ✅ 完整外键约束[^2][^4] | ❌ 不支持 | | **行数统计** | 需全扫描(无缓存)[^4][^5] | 直接读取计数变量(极快)[^5] | | **全文索引** | 5.6+版本支持 | 原生支持 | | **AUTO_INCREMENT** | 必须单列索引[^4] | 可联合索引 | | **适用场景** | 高并发写/事务系统(如订单、支付) | 只读分析/日志系统[^2] | #### 四、典型场景对比 ```plaintext # 更新操作示例(username无索引) UPDATE users SET num=10 WHERE username LIKE "%test%"; ► InnoDB:退化为级锁(因未走索引)[^4] ► MyISAM:始终级锁,阻塞其他所有操作 ``` ### 选型议 1. **选InnoDB**:需事务、高并发写、数据完整性(如金融系统) 2. **选MyISAM**:只读为主、频繁全计数、低写并发(如日志分析) > **当前趋势**:MySQL 5.5+ 默认InnoDB[^2],因其在多数场景的综合优势
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值