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 区别 的相关文章

  • 是什么导致 MyISAM 损坏? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我听说 MyISAM 表可能会损坏 什么样的操作最有可能损坏它们以及如何安全地修复所述损坏 MySQL 文档对此非常明确 http d
  • Windows 上文件操作中的 Mysql InnoDB 操作系统错误号 32

    几天前 我的 Windows 机器上的 MySQL 服务器无法成功关闭自身 我在 MySQL 错误日志中发现了这些行的多个实例 InnoDB Operating system error number 32 in a file operat
  • MySQL使用InnoDB引擎建表时出现1005错误

    当我尝试创建具有以下定义的表时 CREATE TABLE demo id INT 11 NOT NULL auto increment x id INT 11 NOT NULL y id INT 11 NOT NULL z id INT 1
  • MySQL 查询缓存:最大缓存大小限制为 128 MB?

    我的应用程序是数据库密集型的 因此我非常努力地确保应用程序和 MySQL 数据库尽可能高效地协同工作 目前 我正在调整 MySQL 查询缓存 使其符合服务器上运行的查询的特征 query cache size是可以存储在缓存中的最大数据量
  • MySQL:创建表时出现 FK 错误(errno 150)

    我创建了一个模型MySQL工作台 http dev mysql com workbench 现在我正在尝试将其安装到 mysql 服务器 Using 文件 gt 导出 gt 正向工程 SQL CREATE 脚本 它为我输出了一个不错的大文件
  • MySQL InnoDB - 对事务感到困惑

    我已经使用MySQL很多年了 但是没有太多使用InnoDB引擎的经验 我现在正在对它运行一些测试 因为我将要使用它 并且从我读到的内容来看 如果该事务中的任何查询存在任何问题 它不应该允许任何内容 通过 我的问题是 为什么在下面的代码中 当
  • 如何为仅包含 ibdata 和 *.ibd 文件的 MySQL InnoDB 表重新创建 FRM 文件?

    这个问题与我在 stackoverflow 上看到的相关 InnoDB 修复问题略有不同 假设我在 MySQL 5 1 数据库中使用 innodb file per table 1 恢复了以下内容 db tablename ibd inno
  • MySQL:如何实现行级事务锁定而不是表锁定

    这是用例 我有一张桌子 上面有一堆可用或不可用的唯一代码 作为事务的一部分 我想选择表中可用的代码 然后在事务中更新该行 由于这种情况可能会同时在许多会话中同时发生 因此我希望理想地选择一个随机记录并在表上使用行级锁定 以便其他事务不会被从
  • 使用 mysql-server docker 容器在多个服务器上创建 MySQL 集群

    我正在尝试使用以下命令创建一个包含 3 个节点的 MySQL 集群mysql 服务器 https hub docker com r mysql mysql server 码头集装箱 I have 3个独立的云实例并且 docker 已在所有
  • MySQL 5.7 innoDB集群中的一个节点崩溃并且无法将崩溃的节点重新加入集群

    我们的一个环境中有一个 MySQL innodb 集群 集群中的一个节点崩溃了 虽然我们能够使崩溃的节点联机 但无法将其加入集群 有人可以帮助恢复 恢复节点并将其加入集群吗 我们尝试使用 dba rebootClusterFromCompl
  • 如何在mysql中启用INNODB

    当我在 MySQL 中执行查询时 它返回一个错误 指出 InnoDB 未启用 当我点击存储引擎时 InnoDB被禁用 如何启用 InnoDB 您需要在中启用它my cnf文件 然后重新启动服务器 http dev mysql com doc
  • 处理innoDB死锁

    我一直在得到一个Deadlock found when trying to get lock try restarting transaction我的 InnoDB 表上出现错误 这是查询 UPDATE views SET visit cn
  • 字符串前后的通配符 - MySql、PSQL

    我需要执行Contains列中的操作 对于包含操作 我们需要在单词前后使用通配符 例如 个性化 查询 gt like sonal 因为这种类型的查询不能使用索引 有什么办法可以提高搜索速度 注意 我使用MySql InnoDB 和PSQL
  • Mysql InnoDB性能优化和索引

    我有 2 个数据库 需要链接两个大表之间的信息 每个表超过 300 万个条目 并且不断增长 第一个数据库有一个表 pages 用于存储有关网页的各种信息 并包括每个页面的 URL URL 列是 varchar 512 并且没有索引 第二个数
  • 如何重命名 MySQL 数据库(更改架构名称)?

    如何快速重命名 MySQL 数据库 更改其架构名称 通常我只是转储数据库并使用新名称重新导入它 对于非常大的数据库来说 这不是一个选项 显然RENAME DATABASE SCHEMA db name TO new db name 做了坏事
  • Mysql为简单频繁查询创建排序索引性能

    我正在处理一个包含大约 400 万条消息条目的 mysql 表 并尝试根据时间戳选择最新的 50 条消息 另一个要求是返回的消息不以固定前缀开头 问题是单个查询大约占用 25 的 cpu 并且最多需要 1 5 秒 该查询经常由多个客户端执行
  • php 崩溃后 mysql 表被锁定

    我有一个 MySQL DB 和一个 innoDB 表 我有一个 php 页面 用于连接 锁定表 进行一些更新 然后解锁表 PHP 页面通过 wamp 与 apache 一起提供 php页面将文件上传到数据库 我决定通过上传一个大小大于分配给
  • InnoDB如何存储字符列?

    这个问题仅解决 短 的问题CHAR and VARCHAR列存储在 InnoDB 表中 Does a CHAR 10 列正好占用 10 个字节吗 尾随空格会发生什么情况 对于每个字符需要超过 1 个字节的字符集怎么办 如何VARCHAR 1
  • MySQL InnoDB 查询性能

    我正在尝试优化一个简单的 sql 查询 该查询将多次运行大量数据 这是场景 MySQL 与 InnoDB 表 where 和 join 中使用的所有字段都已索引 表有 FK 我不需要查询的整个缓存 但每个表的缓存是可能的 表有更多的更新 插
  • InnoDB 因读未提交而死锁! - Java - Glassfish - EJB3(JPA/Hibernate)

    几天来 我在使用 Glassfish EJB3 和 Mysql InnoDB 的 Java 应用程序上遇到了死锁问题 配置 Mysql InnoDB Ver 14 12 Distrib 5 0 51a 适用于 debian linux gn

随机推荐

  • 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类