MyISAM InnoDB 区别

2023-05-16

出处:网络收集


MyISAM 和 InnoDB 讲解


  InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。


  以下是一些细节和具体实现的差别:


  1.InnoDB不支持FULLTEXT类型的索引。


  2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。


  3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。


  4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。


  5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。


  另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”


  两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。

我作为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,但是从我目前运维的数据库平台要达到需求:99.9%的稳定性,方便的扩展性和高可用性来说的话,MyISAM绝对是我的首选。

  原因如下:

  1、首先我目前平台上承载的大部分项目是读多写少的项目,而MyISAM的读性能是比Innodb强不少的。

  2、MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。

  3、从平台角度来说,经常隔1,2个月就会发生应用开发人员不小心update一个表where写的范围不对,导致这个表没法正常用了,这个时候MyISAM的优越性就体现出来了,随便从当天拷贝的压缩包取出对应表的文件,随便放到一个数据库目录下,然后dump成sql再导回到主库,并把对应的binlog补上。如果是Innodb,恐怕不可能有这么快速度,别和我说让Innodb定期用导出xxx.sql机制备份,因为我平台上最小的一个数据库实例的数据量基本都是几十G大小。

  4、从我接触的应用逻辑来说,select count(*) 和order by 是最频繁的,大概能占了整个sql总语句的60%以上的操作,而这种操作Innodb其实也是会锁表的,很多人以为Innodb是行级锁,那个只是where对它主键是有效,非主键的都会锁全表的。

  5、还有就是经常有很多应用部门需要我给他们定期某些表的数据,MyISAM的话很方便,只要发给他们对应那表的frm.MYD,MYI的文件,让他们自己在对应版本的数据库启动就行,而Innodb就需要导出xxx.sql了,因为光给别人文件,受字典数据文件的影响,对方是无法使用的。

  6、如果和MyISAM比insert写操作的话,Innodb还达不到MyISAM的写性能,如果是针对基于索引的update操作,虽然MyISAM可能会逊色Innodb,但是那么高并发的写,从库能否追的上也是一个问题,还不如通过多实例分库分表架构来解决。

  7、如果是用MyISAM的话,merge引擎可以大大加快应用部门的开发速度,他们只要对这个merge表做一些select count(*)操作,非常适合大项目总量约几亿的rows某一类型(如日志,调查统计)的业务表。

  当然Innodb也不是绝对不用,用事务的项目如模拟炒股项目,我就是用Innodb的,活跃用户20多万时候,也是很轻松应付了,因此我个人也是很喜欢Innodb的,只是如果从数据库平台应用出发,我还是会首选MyISAM。

  另外,可能有人会说你MyISAM无法抗太多写操作,但是我可以通过架构来弥补,说个我现有用的数据库平台容量:主从数据总量在几百T以上,每天十多亿 pv的动态页面,还有几个大项目是通过数据接口方式调用未算进pv总数,(其中包括一个大项目因为初期memcached没部署,导致单台数据库每天处理 9千万的查询)。而我的整体数据库服务器平均负载都在0.5-1左右。






原来是MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。 MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。综述,就可以根据数据表不同的用处是用不同的存储类型。而且MyISAM是文件存储的,可以进行直接在不同操作系统间拷贝使用。

InnoDB:

InnoDB 给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)。这些特性均提高了多用户并发操作的性能表现。在InnoDB表中不需要扩大锁定(lock escalation),因为 InnoDB 的列锁定(row level locks)适宜非常小的空间。InnoDB 是 MySQL 上第一个提供外键约束(FOREIGN KEY constraints)的表引擎。InnoDB 的设计目标是处理大容量数据库系统,它的 CPU 利用率是其它基于磁盘的关系数据库引擎所不能比的。在技术上,InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。 InnoDB 把数据和索引存放在表空间里,可能包含多个文件,这与其它的不一样,举例来说,在 MyISAM 中,表被存放在单独的文件中。InnoDB 表的大小只受限于操作系统的文件大小,一般为 2 GB。InnoDB所有的表都保存在同一个数据文件 ibdata1 中(也可能是多个文件,或者是独立的表空间文件),相对来说比较不好备份,可以拷贝文件或用navicat for mysql。


MyISAM

每张MyISAM 表被存放在三个文件 :frm 文件存放表格定义。 数据文件是MYD (MYData) 。 索引文件是MYI (MYIndex) 引伸。
因为MyISAM相对简单所以在效率上要优于InnoDB,小型应用使用MyISAM是不错的选择。
MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦


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,这样可以提高多用户并发操作的性能。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyISAM InnoDB 区别 的相关文章

  • MySQL DROP 所有表,忽略外键

    有没有一种简单的方法可以从 MySQL 数据库中删除所有表 忽略其中可能存在的任何外键约束 我发现生成的 drop 语句集很有用 并建议进行以下调整 将生成的 drop 限制到您的数据库 如下所示 SELECT concat DROP TA
  • 通过显式排序避免死锁

    我想明确提供有关 MySql InnoDB 应如何获取行锁的顺序 如果可能的话 就不应该出现任何死锁 如果我们遵循惯例 首先 数据库应该按升序锁定表 models 中找到的所有行 然后第二个表 颜色 中的所有行都应按升序锁定 有没有办法控制
  • MariaDB 数据库损坏:引擎中不存在表

    我正在环境设置中 运行 OS XMariaDB 10 0 12 MariaDB Homebrew 我搞砸了安装 所以我从我的设置中完全删除了 MySQL 和 MariaDB 然后重新开始 完成安装 MariaDB 后 我重新导入了我的数据库
  • 200 万行 MySQL MyISAM 表大约需要 150 毫秒

    我正在通过一个由约 200 万行 约 600k 行 两个 MyISAM 表 组成的宠物项目了解 MySQL 性能 在两个 INT 10 索引列上使用 BETWEEN 的范围查询 仅限 1 个返回结果 大约需要 160 毫秒 包括 INNER
  • PHP/MySQL:尽管 CPU 使用率始终低于 40%,但 12 个 CPU 核心能否使应用程序比 6 个 CPU 核心更快?

    我们的问题是 在我们减少 CPU 核心后 MySQL 延迟了我们的应用程序 尽管 CPU 使用率始终低于 40 我的问题是 真的是 CPU 减少导致 MySQL 现在变慢了吗 或者我应该去别的地方看看 更多详细信息 我的团队正在运行一个移动
  • 如何为仅包含 ibdata 和 *.ibd 文件的 MySQL InnoDB 表重新创建 FRM 文件?

    这个问题与我在 stackoverflow 上看到的相关 InnoDB 修复问题略有不同 假设我在 MySQL 5 1 数据库中使用 innodb file per table 1 恢复了以下内容 db tablename ibd inno
  • 使用 mysql-server docker 容器在多个服务器上创建 MySQL 集群

    我正在尝试使用以下命令创建一个包含 3 个节点的 MySQL 集群mysql 服务器 https hub docker com r mysql mysql server 码头集装箱 I have 3个独立的云实例并且 docker 已在所有
  • 迁移php4/mysql4到php5/mysql5:切换到InnoDB?

    我有一个遗留的Web应用程序php4 mysql4 MyISAM 数据库包含一些cms 一些用户数据 一些日历应用程序 现在我要迁移到带有 php5 mysql5 的新服务器 迁移mysql数据库时是否应该更改为InnoDB 预期的优点 缺
  • MySQL中如何压缩列?

    我有一个存储电子邮件通信的表 每当有人 回复 整个路径也被包含并保存到 数据库 我需要这样 因为应用程序的数量 级别更改以纠正太高的情况 尺寸mail文本列是10000 但是 我在存储文本时遇到的困难还不止这些 由于我不确定可以发生多少个通
  • 如何在mysql中启用INNODB

    当我在 MySQL 中执行查询时 它返回一个错误 指出 InnoDB 未启用 当我点击存储引擎时 InnoDB被禁用 如何启用 InnoDB 您需要在中启用它my cnf文件 然后重新启动服务器 http dev mysql com doc
  • 我应该牺牲 innodb_buffer_pool_size/RAM 来为 query_cache_size 腾出空间吗?

    我有一个 16GB 的专用 Mysql 服务器数据库 我的 innodb buffer pool size 设置为 11GB 左右 我正在系统中实现查询缓存 其大小为 80mb 我应该从哪里创建这个空间 innodb buffer pool
  • 使用 mysqldump 转储和加载 MySQL InnoDB 数据库的最快方法是什么?

    我想使用 mysqldump 和 MySQL 5 1 创建一个包含大约 40 个 InnoDB 表和大约 1 5GB 数据的数据库副本 能够实现最快转储和加载数据的最佳参数是什么 即 single transaction 此外 将数据加载到
  • MySQL 5.6 InnoDB 全文搜索

    我意识到 MySQL 5 6 仍处于测试阶段 但是有人有使用新的 InnoDB FTS 引擎的经验吗 它与狮身人面像之类的东西相比如何 谢谢 贾森 从未使用过 Sphinx 但在大约 170k 行的 Innodb 表上尝试过 MySQL 5
  • 如何使用索引优化 InnoDB 上的 COUNT(*) 性能

    我有一个较大但狭窄的 InnoDB 表 有大约 9m 条记录 正在做count or count id 桌子上的速度非常慢 6秒以上 DROP TABLE IF EXISTS perf2 CREATE TABLE perf2 id int
  • 如何提高MySQL INSERT和UPDATE性能?

    我们数据库中的 INSERT 和 UPDATE 语句的性能似乎正在下降 并导致我们的 Web 应用程序性能不佳 表是InnoDB 应用程序使用事务 我可以做一些简单的调整来加快速度吗 我认为我们可能会遇到一些锁定问题 我怎样才能找到答案 你
  • mysql_upgrade 失败 - innodb 表不存在?

    我正在将 mysql 5 5 docker 容器数据库升级到 mysql 5 6 docker 容器 我能够解决所有其他问题 最后我的服务器运行的是 5 6 但是当我运行 mysql upgrade 时出现以下错误 ERROR root 1
  • 处理ON INSERT触发器时,innodb表如何锁定?

    我有两个 innodb 表 articles id title sum votes 1 art 1 5 2 art 2 8 3 art 3 35 votes id article id vote 1 1 1 2 1 2 3 1 2 4 2
  • 未知的表引擎“InnoDB”

    最近 我发现如果我有好的硬件 我可以最大限度地提高 mysql 的性能 由于我一直在使用 InnoDB 所以我在 my ini 中添加了额外的配置 以下是新添加的配置 innodb data file path ibdata1 10M au
  • Mysql innoDB 不断崩溃[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的数据库 mysql 服务器不断崩溃 重新启动 我不知道该怎么办 我不断在 dbname org err 文件中收到以下内容 13120
  • 如何检测Mysql/innodb中的死锁?

    我知道在 Innodb 中使用事务时不可避免地会发生死锁 并且如果应用程序代码正确处理死锁 它们是无害的 正如手册所说 只需再试一次 所以我想知道 如何检测死锁 死锁是否会发出一些特殊的 mysql 错误号 如果重要的话 我正在使用 PHP

随机推荐

  • magento中单例模式的变形实现

    单例模式确保某一个类只有一个实例 xff0c 而且自行实例化并向整个系统提供这个实例 这个类称为单例类 单例模式的要点有三个 xff1b 一是某个类只能有一个实例 xff1b 二是它必须自行创建这个实例 xff1b 三是它必须自行向整个系统
  • Linux下chkconfig命令详解

    http www cnblogs com panjun Donet archive 2010 08 10 1796873 html chkconfig命令主要用来更新 xff08 启动或停止 xff09 和查询系统服务的运行级信息 谨记ch
  • VIM常用命令

    http bbs phpchina com thread 123131 1 1 html 常用的命令 xff1a d0 表示删除从当前光标到光标所在行首的内容 y 表示拷贝从当前光标到光标所在行尾的内容 d 表示删除从当前光标到光标所在行尾
  • C语言程序的内存布局

    http www cnblogs com chenyadong archive 2011 11 28 2266506 html C语言程序的内存布局 一 xff1a C语言程序的存储区域 C语言编写的程序经过编绎 链接后 xff0c 将形成
  • STM32学了很久,我还是不会做项目。

    关注 星标公众号 xff0c 不错过精彩内容 素材来源 xff1a 知乎 编辑整理 xff1a 张巧龙 知乎有人问 xff1a Stm32学了好久了 xff0c 感觉独立做项目还是有力不从心的感觉 从51开始学习 xff0c 到stm32
  • Gvim的字体、颜色、背景设置

    http apps hi baidu com share detail 5348127 很多朋友在使用Linux文本编辑器Gvim的时候 xff0c 遇到这样的问题 xff0c 字体太小 xff0c 或者想还一种自己个喜欢的字体 这可通过e
  • magento负载均衡使用同一个数据库的方法

    在magento的负载均衡策略中 xff0c 其中一个方法是有多台服务来跑同一份代码 xff0c 使用同一个数据库 例如 xff0c 有一台服务器A xff0c 网址是www a com xff0c 另外一台服务器B xff0c 网址是ww
  • 25个Apache性能优化技巧推荐

    http www php100 com html webkaifa apache 2011 0708 8411 html Apache 至今仍处于web服务器领域的霸主 xff0c 无人撼动 xff0c 没有开发者不知道 本篇文章介绍25个
  • Ubuntu 10.04 10.10 11.04 9.10 9.04 中文字体美化——安装雅黑

    http os 51cto com art 201109 288883 htm 刚接触Ubuntu xff0c 可能会觉得那中文字体怪怪的 xff0c 看着不顺眼 xff0c 没关系 xff0c 可以换成你看着顺眼的 xff08 伪Linu
  • 高级应用Magento-订单创建流程及程序代码

    出处 xff1a http www wemvc com 1606 html 老规矩 xff0c 直接看代码吧 下面的代码是如何通过程序创建一个完美订单 lt php require once 39 app Mage php 39 Mage
  • 精通递归程序设计

    http www ibm com developerworks cn linux l recurs html 计算机科学的新学生通常难以理解递归程序设计的概念 递归思想之所以困难 xff0c 原因在于它非常像是循环推理 xff08 circ
  • 优化Apache,提高并发

    http www yuansir web com 2011 10 24 E4 BC 98 E5 8C 96apache EF BC 8C E6 8F 90 E9 AB 98 E5 B9 B6 E5 8F 91 Apache 配置 xff1a
  • magento中的attribute 总结

    1 加载某个attribute xff1a attributeCode 61 Mage getModel 39 catalog resource eav attribute 39 gt load attrbuteId gt getData
  • magento项目中使用多个数据库的方法

    1 在app etc local xml 中 xff0c 添加新的数据库选项 lt xml version 61 34 1 0 34 gt lt Magento NOTICE OF LICENSE This source file is s
  • 为Ubuntu添加PATH环境变量

    http blog csdn net pang123hui article details 6452144 添加分两种 xff1a 一 临时性添加 echo PATH 显示当前环境变量 usr local sbin usr local bi
  • 带你全面认识 Linux

    点击上方 大鱼机器人 xff0c 选择 置顶 星标公众号 福利干货 xff0c 第一时间送达 xff01 来源 xff1a CSDN xff08 ID xff1a CSDNnews xff09 作者 xff1a arvin 译者 xff1a
  • timewait

    netstat n awk tcp 43 43 S NF END for a in S print a S a LAST ACK 16 SYN RECV 348 ESTABLISHED 70 FIN WAIT1 229 FIN WAIT2
  • Apache服务器使用.htaccess实现图片防盗链

    http www chinaz com server 2009 0718 83330 shtml htaccess文件将影响其所在的目录及其子目录 xff0c 因此 xff0c 如果我们要保护的内容 xff08 此处以防止图片盗链为例 xf
  • VIM复制粘贴大全

    原文地址 xff1a http lsong17 spaces live com blog cns 556C21919D77FB59 603 entry 内容 xff1a 用vim这么久 了 xff0c 始终也不知道怎么在vim中使用系统粘贴
  • MyISAM InnoDB 区别

    出处 xff1a 网络收集 MyISAM 和 InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型 xff0c 这两个表类型各有优劣 xff0c 视具体应用而定 基本的差别为 xff1a MyISAM类