言:

  之前简单介绍过 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. spring security原理

    spring security通过一系列过滤器实现其功能,入口过滤器如下(web.xml): <filter> <filter-name>springSecurityFilte ...

  2. MVC4 中使用 Area 和 注意的地方

    在MVC项目中经常会使用到Area来分开不同的模块让项目结构更加的清晰. 步骤如下:  项目 –> 添加 -> 区域 (Area)  输入 Admin 添加成功后 Area包含:创建一个空 ...

  3. 统计easyui datagrid某列之和显示在对应列下面

    项目需求要在表格下面加一行统计求和的,结果网上搜寻了一堆,要么说的不详细,高深大牛们的见解:要么实现不了,搜寻老半天修改出一个可以用的,做一下学习记录,新手菜鸟,欢迎指正和新解决方案. 最终效果图: ...

  4. docker学习笔记1-- 用Toolbox安装Docker--介绍Docker Machine

    使用的是Docker Toolbox,非Docker for Windows 一.docker的认识与安装(windows安装) http://blog.csdn.net/tina_ttl/artic ...

  5. iOS 当公司有人向你提问,你该如何应对?

    今天 因为iOS 开发的内部版本号耿耿于怀好久,释然后让我有了一个新想法:从前,能让我兴奋的点是解决一个有一个拗脑筋的问题,见大部分博客便知,都是技术方面的积累. 那么从今天起我决定让自己有个新起点, ...

  6. C# Xml Linq XDocument 基本操作 -- 重新学习

    person.xml <?xml version="1.0" encoding="utf-8"?> <MyP> <P1> & ...

  7. 一个由自增运算符以及C语法顺序细节引起的bug

     一.问题描述 在编写modbus代码时发生一件由语法细节引起的bug,起因是自增运算符以及C语法顺序. 输入的数据是2233=0X08B9,高低字节顺序是0x08 0xB9, 使用modbus po ...

  8. Shell编程基础及变量

    一.Shell脚本 1.Shell脚本的建立 由Linux命令.shell命令.程序结构控制语句和注释等内容组成. 脚本第一行 #!/bin/bash #!字符称为幻数,内核会根据它后面的解释器来确定 ...

  9. 20145239《网络对抗》- 逆向及Bof基础实践

    1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串.该程序同 ...

  10. Go Concurrency or Parallel

    关于并发和并行,先看两个示例 示例1: package main import "fmt" var quit = make(chan int) func foo6(){ for i ...