言:

  之前简单介绍过 MySQL 常用的存储引擎,今天对两个主流的存储简单分析下差异,书上没有参考的笔试题解答注解;

差异:

  MyISAM 只支持表锁,不支持事务,表损坏率较高。较老的存储引擎。

       它分为2种类型的文件:以 MYD 作为后缀名的数据文件和以 MYI 作为后缀名的索引文件。
       MyISAM 读写并发不如 InnoDB,适用于INSERT较多的场景,且支持直接复制文件,用以备份数据,
       是 MySQL 公司开发的,物理文件主要有数据文件,日志文件和索引文件,并且这三个文件是单独存在。

 
       InnoDB 支持行锁,支持事务,支持行级锁,Crash(崩溃)后具有 Revcover(还原)机制,
       只有 ibd 文件,分为数据区和索引区,有较好的读写并发能力,但做 COUNT 运算时相当消耗CPU,
       是 InnoDB 公司开发的。物理文件有日志文件,数据文件和索引文件。
       其中,索引文件和数据文件是放在一个目录下,可以设置共享文件、独享文件两种格式。
  

PS:help_topic MyISAM 表、innerdb InnoDB 表;

 

MyISAM

InnoDB

构成上的区别

每个MyISAM在磁盘上存储成三个文件。

每一个文件的名字就是表的名字,文件名都和表名相同,

扩展名指出文件类型。

表定义的扩展名为.frm(frame,存储表定义);

数据文件的扩展名为.MYD(MYData,存储数据);

索引文件的扩展名是.MYI(MYIndex,存储索引);

数据文件和索引文件可以放置在不同的目录下,

平均分布I/O,获得更快的速度。

只有ibd文件,分为数据区和索引区,有较好的读写并发能力。

物理文件有:日志文件、数据文件和索引文件。

其中,索引文件和数据文件是放在一个目录下,可以设置共享文件与独享文件两种格式。

基于磁盘的资源是 InnoDB 表空间数据文件和它的日志文件,

InnoDB 表的大小只受限于操作系统文件的大小,一般为2GB(单个文件)。

InnoDB 存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。

但是对比 MyISAM 的存储引擎,InnoDB 写的处理效率差一些,

并且会占用更多的磁盘空间以保留数据和索引。

事务处理上方面

MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,

但是不提供事务支持。

InnoDB提供事务支持事务、外键等高级数据库功能。

SELECT
UPDATE
INSERT
DELETE

如果执行大量的 SELECT,那么 MyISAM 是更好的选择。

(1)如果执行大量的INSERT或UPDATE,那么出于性能方面的考虑,应该使用InnoDB表。

(2)当执行DELETE FROM table时,InnoDB不会重建表,而是一行一行地删除。

(3)LOAD TABLE FROM MASTER 操作对 InnoDB 是不起作用的,

  解决方法是首先把 InnoDB 表改成 MyISAM 表,导入数据后再改成 InnoDB 表,

  但是对于使用的额外的 InnoDB 特性(例如外键)的表不适用。

清空表

MyISAM 会重建表。

InnoDB 是一行一行地删除,效率非常慢。

对AUTO_INCREMENT列的操作

MyISAM 为 INSERT 和 UPDATE 操作自动更新这一列。

AUTO_INCREMENT 值可用 ALTER TABLE 来重置。

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

如果为一个表指定AUTO_INCREMENT列,

那么在数据字典里的InnoDB表句柄包含一个名为自动增长计数器的计数器,

它被用在为该列赋新值,自动增长计数器仅被存储在主内存中,而不是存在磁盘上。

InnoDB中必须包含只有该字段的索引。

表的行数

当执行SQL语句“SELECT COUNT(*) FROM TABLE”时,

MyISAM只是简单地读出保存好的行数,需要注意的是,

当COUNT(*)语句包含WHERE条件时,

MyISAM和InnoDB的操作是一样的。

InnoDB中不保存表的具体行数,也就是说,

当执行SELECT COUNT(*) FROM TABLE时,InnoDB要扫描一遍整个表来计算行数。

表级锁定(更新时锁定整个表):其锁定机制是表级索引,

这虽然可以让锁定的实现成本很小,但是也同时大大降低了其并发性能。

不支持行级锁,只支持并发插入的表锁,主要用于高负载的SELECT。

提供行级锁(locking on row level),

提供与 Oracle 类型一致的不加锁读取(non-locking read),

另外,InnoDB 表的行锁也不是绝对的,

如果在执行一个 SQL 语句时 MySQL 不能确定要扫描的范围,

那么 InnoDB 表同样会锁全表,

例如 UPDATE TABLE T_TEST_LHR SET NUM=1 WHERE NAME LIKE "%LHR%"。

MySQL InnoDB与MyISAM存储引擎差异的更多相关文章

  1. InnoDB和MyISAM存储引擎的区别

    在MySQL数据库的使用过程中我们经常会听到存储引擎这个名词.MySQL的存储引擎有好多种如InnoDB.MyISAM.Memory.NDB等等,多存储引擎也是MySQL数据库的特色. InnoDB和 ...

  2. innodb和myisam存储引擎插入速度

    --innodb和myisam存储引擎插入速度 ------------------------------------2014/05/21 MySQL 5.6 全部默认设置,插入数据9999条,性能 ...

  3. 第二课——解析mysqldump命令和mysqlbinlog命令+innodb和Myisam存储引擎简介

    环境说明 mysql版本:Percona-Server-5.6.30 IP:10.7.15.167 端口:3306 安装目录:/httx/run/mysql 数据目录:/httx/run/mysql/ ...

  4. 【MySQL】MySQL(四)存储引擎、索引、锁、集群

    MySQL存储引擎 MySQL体系结构 体系结构的概念 任何一套系统当中,每个部件都能起到一定的作用! MySQL的体系结构 体系结构详解 客户端连接 支持接口:支持的客户端连接,例如C.Java.P ...

  5. Mysql更换MyISAM存储引擎为Innodb的操作记录

    一般情况下,mysql会默认提供多种存储引擎,可以通过下面的查看: 1)查看mysql是否安装了innodb插件.通过下面的命令结果可知,已经安装了innodb插件. mysql> show p ...

  6. mysql的innodb存储引擎和myisam存储引擎的区别

    主要区别如下: 1.事务支持.innodb支持事务,事务(commit).回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transacti ...

  7. mysql修改表的存储引擎(myisam<=>innodb)【转】

    修改表的存储引擎myisam<=>innodb 查看表的存储引擎mysql> show create table tt7;+-------+--------------------- ...

  8. [转帖]一文看懂mysql数据库本质及存储引擎innodb+myisam

    一文看懂mysql数据库本质及存储引擎innodb+myisam https://www.toutiao.com/i6740201316745740807/ 原创 波波说运维 2019-09-29 0 ...

  9. MySQL数据库MyISAM存储引擎转为Innodb

    MySQL数据库MyISAM存储引擎转为Innodb  之前公司的数据库存储引擎全部为MyISAM,数据量和访问量都不是很大,所以一直都没什么问题.但是最近出现了MySQL数据表经常被锁的情况,直接导 ...

随机推荐

  1. ThinkPHP官网瀑布流实现分享

    很多人都想做瀑布流的效果,这里告诉大家官网使用的方法. 首先要下载瀑布流的插件jquery.masonry.min.js 地址:http://masonry.desandro.com/index.ht ...

  2. Android系统移植与调试之------->如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏

    这两天由于一个客户的要求,将MID竖屏时候的状态条上的音量键去掉.所以尝试修改了一下,成功了,分享一下经验. 先看一下修改后的效果图,如下所示 . 横屏的时候:有音量加减键 竖屏的时候:音量加减键被去 ...

  3. jQuery实现复选框全选、全不选、反选问题解析

    今天打算用jQuery实现一下复选框的全选.全不选和反选问题,刚开始用的是attr("checked",true/false)方法,发现只能在最开始实现一次全选,可以实现全不选,无 ...

  4. Win8.1和office2013使用电话激活步骤

    Win8.1和office2013使用电话激活步骤: 先从Win8.1贴吧的最后几个回复中找到几个密钥,最后的通常是最新的,然后输入到Win8.1中,会提示你密钥无效,如果有效你就走了狗屎运了,无效的 ...

  5. 【转】ModelAndView 学习

    http://blog.csdn.net/wavaya/article/details/6185226 ModelAndView 类别就如其名称所示,是代表了Spring Web MVC程式中呈现画面 ...

  6. python更新模块

    pip install -U 模块名 # 这是 python2+ 版本的用法更新模块 pip3 install -U 模块名 # 这是 python3+ 版本的用法更新模块

  7. 使用新浪IP库获取IP详细地址

    使用新浪IP库获取IP详细地址 <?php class Tool{ /** * 获取IP的归属地( 新浪IP库 ) * * @param $ip String IP地址:112.65.102.1 ...

  8. 如何成为专业的PHP开发者

    如何才能成为一名专业的PHP开发者?资深Web开发者Bruno Skvorc在其博客上分享了一些心得. 当阅读各种和PHP相关的博客.Quora问题.Google+社区.资讯和杂志的时候,Bruno ...

  9. java对象生命周期概述复习

    最近看了下java对象的生命周期做个笔记复习复习,很多不同的原因会使一个java类被初始化,可能造成类初始化的操作: 1)  创建一个java类的实例对象. 2)  调用一个java类中的静态方法. ...

  10. 安装Discuz开源论坛

    11.添加mysql普通用户 接着上篇的lamp这篇安装Discuz 配置虚拟主机 1.打开虚拟主机配置 [root@NFS-31 ~]# vim /usr/local/apache2/conf/ht ...