登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
3
Star
47
Fork
23
DreamCoders
/
CoderGuide
代码
Issues
1169
Pull Requests
0
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
开发画像分析
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
MySQL存储引擎MyISAM与InnoDB区别
待办的
#IAJKZL
陌生人
拥有者
创建于
2024-08-13 10:10
<p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;">区别:</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;"> 1.InnoDB 支持事务,MyISAM 不支持。对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;"> 2. InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的InnoDB表转为MYISAM会失败; (外键现在用的也不多,因为它关联性太强,如果要删除一个表,会因为有外键的关联而导致删除失败。通常是通过 table a = table b on a.id = b.id 这种两表关联的方式来间接替代外键作用 )</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;"> 3.InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的;MyISAM是非聚集索引,它也是使用B+Tree作为索引结构,但是索引和数据文件是分离的,索引保存的是数据文件的指针。</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;"> 4.InnoDB 必须要有主键,MyISAM可以没有主键;InnoDB 如果我们没有明确去指定创建主键索引。它会帮我们隐藏的生成一个 6 byte 的 int 型的索引作为主键索引。</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;"> 5.InnoDB辅助索引和主键索引之间存在层级关系;MyISAM辅助索引和主键索引则是平级关系。即:InnoDB 如果添加其他辅助索引,辅助索引查询就需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也相应都会很大。(比如表中有id(主键),name,age 字段,我们创建一个主键索引,再来创建一个name索引,层级关系如下图所示)</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;"> 6. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快(注意不能加有任何WHERE条件);</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;"> 7. Innodb不支持全文索引,而MyISAM支持全文索引,在全文索引领域的查询效率上MyISAM速度更快高;(MySQL 5.7 版本以后,InnoDB也支持全文索引了)</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;"> 8. InnoDB支持表级锁、行级锁,默认为行级锁;而 MyISAM 仅支持表级锁。InnoDB 的行锁是实现在索引上的,而不是锁在物理行上。如果访问未命中索引,也是无法使用行锁,将会退化为表锁</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;"> 9. Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI。【InnoDB 中,.frm文件:保存的是表结构定义描述文件;.ibd文件:保存的是employee表中的数据内容】;【MyISAM中,.frm文件:保存的是表结构定义描述文件,.MYD文件:保存的是数据内容,.MYI文件:保存的是索引内容】(好像是在MySQL 8.0中,.frm 文件已经不存在了,此处以MySQL5.7介绍)</span></p><p><br></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;">如何选择?</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;">判断是否需要支持事务,如果要请选择 InnoDB,如果不需要可以考虑MyISAM;</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;">如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果既有读也有写,那还是使用InnoDB吧。</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;">系统奔溃后,MyISAM恢复起来更困难;</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;">MySQL5.5 版本开始 InnoDB 已经成为 MysQL 的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。</span></p>
<p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;">区别:</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;"> 1.InnoDB 支持事务,MyISAM 不支持。对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;"> 2. InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的InnoDB表转为MYISAM会失败; (外键现在用的也不多,因为它关联性太强,如果要删除一个表,会因为有外键的关联而导致删除失败。通常是通过 table a = table b on a.id = b.id 这种两表关联的方式来间接替代外键作用 )</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;"> 3.InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的;MyISAM是非聚集索引,它也是使用B+Tree作为索引结构,但是索引和数据文件是分离的,索引保存的是数据文件的指针。</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;"> 4.InnoDB 必须要有主键,MyISAM可以没有主键;InnoDB 如果我们没有明确去指定创建主键索引。它会帮我们隐藏的生成一个 6 byte 的 int 型的索引作为主键索引。</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;"> 5.InnoDB辅助索引和主键索引之间存在层级关系;MyISAM辅助索引和主键索引则是平级关系。即:InnoDB 如果添加其他辅助索引,辅助索引查询就需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也相应都会很大。(比如表中有id(主键),name,age 字段,我们创建一个主键索引,再来创建一个name索引,层级关系如下图所示)</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;"> 6. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快(注意不能加有任何WHERE条件);</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;"> 7. Innodb不支持全文索引,而MyISAM支持全文索引,在全文索引领域的查询效率上MyISAM速度更快高;(MySQL 5.7 版本以后,InnoDB也支持全文索引了)</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;"> 8. InnoDB支持表级锁、行级锁,默认为行级锁;而 MyISAM 仅支持表级锁。InnoDB 的行锁是实现在索引上的,而不是锁在物理行上。如果访问未命中索引,也是无法使用行锁,将会退化为表锁</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;"> 9. Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI。【InnoDB 中,.frm文件:保存的是表结构定义描述文件;.ibd文件:保存的是employee表中的数据内容】;【MyISAM中,.frm文件:保存的是表结构定义描述文件,.MYD文件:保存的是数据内容,.MYI文件:保存的是索引内容】(好像是在MySQL 8.0中,.frm 文件已经不存在了,此处以MySQL5.7介绍)</span></p><p><br></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;">如何选择?</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;">判断是否需要支持事务,如果要请选择 InnoDB,如果不需要可以考虑MyISAM;</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;">如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果既有读也有写,那还是使用InnoDB吧。</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;">系统奔溃后,MyISAM恢复起来更困难;</span></p><p><span style="color: rgb(0, 0, 0); font-family: 微软雅黑;">MySQL5.5 版本开始 InnoDB 已经成为 MysQL 的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。</span></p>
评论 (
0
)
登录
后才可以发表评论
状态
待办的
待办的
进行中
已完成
已关闭
负责人
未设置
标签
MySql
未设置
标签管理
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
分支 (
-
)
标签 (
-
)
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
参与者(1)
1
https://gitee.com/DreamCoders/CoderGuide.git
git@gitee.com:DreamCoders/CoderGuide.git
DreamCoders
CoderGuide
CoderGuide
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册