MyISAM 与InnoDB 数据表类型区别

2023-05-16

http://blog.sina.com.cn/s/blog_5a8b8eb80100stge.html


  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 “�a%”

  两种类型最主要的差别就是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左右。


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

MyISAM 与InnoDB 数据表类型区别 的相关文章

  • MySQL 5.5:对于 innodb 中的 text/varchar 字段,以下哪一项是更好的存储方式?

    要求 Page 1 gt 显示用户及其最新 10 篇博客文章的 1 2 行预览 Page 2 gt 显示带有全文的单个博客文章 方法一 MySQL table gt userid gt varchar 50 post id gt integ
  • MySQL 更新查询 - 竞争条件和行锁定会遵守“where”条件吗? (PHP、PDO、MySQL、InnoDB)

    我正在尝试建立一个先到先得的模型销售页面 我们有 n 个相同类型的物品 我们希望将这 n 个项目分配给前 n 个发出请求的用户 每个项目对应有一个数据库行 当用户按下购买按钮时 系统会尝试查找尚未出售的条目 reservationCompl
  • InnoDB SELECT ... FOR UPDATE 语句锁定表中的所有行

    MySQL 服务器版本 5 1 41 启用了 InnoDB 插件 我有以下三个发票表 invoices invoice components 和invoice expenses 表发票有invoice id 主键 发票 组件和发票 费用都链
  • MySQL InnoDB 因等待表级锁而挂起

    我有一个大型生产网络应用程序 Glassfish 3 1 MySQL 5 5 所有表都是InnoDB 每隔几天应用程序就会完全挂起 SHOW FULL PROCESSLIST显示不同表上的许多简单插入或更新查询 但都有状态 等待表级锁 例子
  • 何时需要将表从 MyISAM 更改为 InnoDb?

    这个问题就像我之前问题的延续 InnoDb 比 MyISAM 更适合频繁的并发更新和插入 我这样说对吗 https stackoverflow com questions 1722155 am i right that innodb is
  • 将 MySQL innodb 数据库加载到内存中

    我有一个 1 9GB 的 MySQL innodb 数据库 通过以下命令显示 SELECT table schema Data Base Name sum data length index length 1 048 576 as Data
  • 如何找到MySQL临时表存储引擎

    您好 我正在使用临时表 我想知道临时表存储引擎 InnoDB MyISAM 我正在使用以下代码来查找 但它没有向我显示存储引擎 engine SELECT ENGINE FROM information schema TABLES WHER
  • mySQL - 使用 mysqli 应用行级锁

    使用 PHP 的 mysqli 如何应用行级锁 行级锁会阻止任何人编辑当前存在的符合您条件的行 对吗 但是他们会阻止用户插入符合您条件的行吗 Thanks 如果您想锁定特定行以防止编辑 请使用FOR UPDATE在 SELECT 查询的末尾
  • 通过显式排序避免死锁

    我想明确提供有关 MySql InnoDB 应如何获取行锁的顺序 如果可能的话 就不应该出现任何死锁 如果我们遵循惯例 首先 数据库应该按升序锁定表 models 中找到的所有行 然后第二个表 颜色 中的所有行都应按升序锁定 有没有办法控制
  • 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
  • 200 万行 MySQL MyISAM 表大约需要 150 毫秒

    我正在通过一个由约 200 万行 约 600k 行 两个 MyISAM 表 组成的宠物项目了解 MySQL 性能 在两个 INT 10 索引列上使用 BETWEEN 的范围查询 仅限 1 个返回结果 大约需要 160 毫秒 包括 INNER
  • MySQL 查询缓存:最大缓存大小限制为 128 MB?

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

    我有一个表 我正在尝试更改其主键 这是表定义 CREATE TABLE tbl customer PersonId int 11 NOT NULL Id int 10 unsigned NOT NULL Name varchar 100 c
  • mysql 中键集分页的索引

    我正在尝试在 mysql 中构建索引以支持键集分页查询 我的查询如下所示 SELECT FROM invoice WHERE company id someguid AND id gt lastguidfromlastpage ORDER
  • 如何在 MySQL 查询中使用正则表达式

    我有一个简单的任务 我需要搜索以字符串字符开头及其后一个数字的记录 我正在尝试的是这个 SELECT trecord FROM tbl WHERE trecord LIKE ALA d And SELECT trecord FROM tbl
  • MySQL系统数据库表可以转换为InnoDB吗?

    我最近安装了MySQL 5 5 我在用着InnoDB作为我所有数据库的引擎 我注意到mysql数据库默认值及其所有表 用户 数据库等 都是MyISAM 有什么理由他们不能 不应该InnoDB 有谁知道 MySQL 是否需要mysql数据库是
  • 在 MySQL 中使用 NoSQL

    我注意到 MySQL 可以将 Memcached NoSQL 与 InnoDB 结合使用 但我无法检索有关如何使用它的信息 我想与 PHP 一起使用 NoSQL 查询是标准的吗 首先 MySQL从5 6版本开始只支持NoSQL的memcac
  • InnoDB:无法打开或创建系统表空间

    我在 Xampp 上打开 mysql 服务器时遇到问题 错误 MySQL 意外关闭 这可能是由于端口被阻止 缺少依赖项 不正确的权限 崩溃或通过其他方法关闭 按日志按钮查看错误日志并检查 Windows 事件查看器以获取更多线索 如果您需要
  • mysql_upgrade 失败 - innodb 表不存在?

    我正在将 mysql 5 5 docker 容器数据库升级到 mysql 5 6 docker 容器 我能够解决所有其他问题 最后我的服务器运行的是 5 6 但是当我运行 mysql upgrade 时出现以下错误 ERROR root 1
  • InnoDB 或 MyISAM - 为什么不两者都使用呢?

    我读过各种关于两者之间哪个更好的主题InnoDB and MyISAM 看来争论的都是使用还是其他 根据表的不同 是否不能同时使用两者 这样做会有什么缺点 据我所知 发动机可以在CREATE TABLE命令 因此 某些经常读取的表可以设置为

随机推荐

  • Linux Windows 双启动 Grub 修复

    出处 xff1a http hotthing blog 163 com blog static 29670309200971974412760 Linux Windows 双启动 Grub 修复 重新安装 windows 后 linux的启
  • ubuntu11.04使用U盘启动或安装的方法

    出处 xff1a http blessht iteye com blog 1077674 今天在ubuntu官网下载最新版的iso xff0c 并且按照提示下载了名为 Universal USB Installer exe 的文件将iso写
  • Ubuntu11.04安装完全指南

    出处 xff1a http apps hi baidu com share detail 46047864 Ubuntu11 04安装完全指南 李顺亮 2011年5月3日00 44 09 现在的世界变化快 xff0c 早已不再年少的我们 x
  • Ubuntu 11.04更改分辨率

    出处 xff1a http www linuxidc com Linux 2011 08 41465 htm 刚从Ubuntu 10 10升级到11 04 xff0c 一切很顺利 xff0c 只是有部分软件要重新装下 xff0c 这倒没什么
  • 开机自动启动 Ubuntu iBus 输入法

    http apps hi baidu com share detail 5399322 buntu 的默认输入法是 ibus xff0c 但是发现系统启动时它不会自动启动 Google 的说法是 xff1a Ubuntu 系统安装后虽然自带
  • ubuntu 下更改窗口的默认颜色

    白色实在太刺眼 xff0c 在ubuntu 下同样也更改窗口颜色保护眼睛 更改边框的颜色 xff1a 在桌面上右键 xff0d 更改桌面背景 xff0d 主题 xff0d 自定义 xff0d 颜色 xff0d 输入框 xff0d 背景 R
  • Linux操作系统挂载U盘和硬盘光驱的问题

    http root 5d6d com thread 726 1 1 html 一 Linux挂载U盘 1 插入u盘到计算机 xff0c 如果目前只插入了一个u盘而且你的硬盘不是scsi的硬盘接口的话 xff0c 那它的硬件名称为 sda1
  • STM32:从菜鸟到牛人就是如此简单!

    为了学习单片机而去学习单片机的思路是不对的 你问 如何系统地入门学习stm32 xff1f 本身就是一个错误的问题 假如你会使用8051 会写C语言 那么STM32本身并不需要刻意的学习 你要考虑的是 我可以用STM32实现什么 xff1f
  • 如何在Ubuntu下制作ISO镜像

    http cursed iteye com blog 472512 在Windows下有很多大型破解软件可以完成 xff0c 但是在linux下就轻便多了 而且不用承受非法使用软件带来的不安 xff08 如果你感觉不安的话 xff09 步骤
  • Ubuntu中配置双显示器方法

    http hankgong iteye com blog 667022 现在很多人为了提高工作效率 xff0c 都用双显示器了 xff0c 我用了快有3年了 windows中配置双显示器是比较简单的 xff0c 只要显卡装好了 xff0c
  • pdf阅读器xpdf的安装与中文乱码问题

    http apps hi baidu com share detail 17962100 1 安装xpdf xff1a sudo apt get install xpdf 2 解决xpdf打开中文时的乱码问题 xff1a sudo apt
  • wamp 中apache没法启动的问题

    最近重装了window xff0c 所有的软件都需要重装 xff0c 但装了wamp后发现apache 总是没法启动 后来发现退出skype后apache就能启动 xff0c 哦 xff0c 想到apache启动后需要用80端 xff0c
  • ubuntu 用root登录后没法使用chromium 的问题

    用root登录后启动chromium会出现错误 xff1a Google Chrome can not be run as root Please start Google Chrome as a normal user To run as
  • Linux下的XAMPP基本配置技巧(设置虚拟主机、添加FTP账户等)

    http www cnblogs com luoine archive 2011 03 09 1978096 html xampp安装好之后就只有一个默认站点及一个默认nobody的ftp账户 xff0c 这显然不符合我们平时的需求了 xf
  • 揭秘SQL优化技巧 改善数据库性能

    http www php100 com html webkaifa database Mysql 2011 1206 9438 html 这篇文章是以 MySQL 为背景 xff0c 很多内容同时适用于其他关系型数据库 xff0c 需要有一
  • mysql 5.0存储过程学习总结

    http www ccvita com 100 html mysql存储过程的创建 xff0c 删除 xff0c 调用及其他常用命令 mysql 5 0存储过程学习总结 一 创建存储过程 1 基本语法 xff1a create proced
  • SVN常用命令

    http sunjun041640 blog 163 com blog static 2562683220111154567740 1 将文件checkout到本地目录 svn checkout path xff08 path是服务器上的目
  • magento :如何在后台的form中添加内容可变的select filed

    如下图 xff1a 在product form中添加了一个attribute spot spotter xff0c 这个attribute可以选择某个已注册的用户 注意了 xff0c 由于这个attribute 的内容是动态变化的 xff0
  • STM32好找工作,所以学linux错了吗?

    不知道各位朋友有没有发现 xff0c 公众号改版了 xff0c 现在的推送规则已经不一定是按照时间顺序了 xff0c 有一些小伙伴甚至几天收不到消息 xff0c 要点进去公众号主页才能看到 所以 xff0c 为了账号不会从您的订阅表里面消失
  • MyISAM 与InnoDB 数据表类型区别

    http blog sina com cn s blog 5a8b8eb80100stge html InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型 xff0c 这两个表类型各有优劣 xff0c 视具体应用而定 基本