MySQL InnoDB与MyISAM存储引擎差异

前言:

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

差异:

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

它分为2种类型的文件:以 MYD 作为后缀名的数据文件和以 MYI 作为后缀名的索引文件。

MyISAM 读写并发不如 InnoDB,适用于INSERT较多的场景,且支持直接复制文件,用以备份数据,

是 MySQL 公司开发的,物理文件主要有数据文件,日志文件和索引文件,并且这三个文件是单独存在。

InnoDB 支持行锁,支持事务,支持行级锁,Crash(崩溃)后具有 Revcover(还原)机制,

只有 ibd 文件,分为数据区和索引区,有较好的读写并发能力,但做 COUNT 运算时相当消耗CPU,

是 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%"。

时间: 2024-10-06 06:27:10

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

mysql InnoDB 和 Myisam 存储引擎的区别

1. InnoDB 支持事物,Myisam 不支持事物 2. InnoDB 是行级锁,Myisam 表级锁 3. InnoDB 不支持全文索引,Myisam 支持全文索引,但不支持外键 4. InnoDB 在磁盘上是两个文件,Myisam 是三个文件 5 myISAM管理非事务表.它提供高速存储和检索,以及全文搜索能力.如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择 6InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持.如果应用中需要执行大量的INSER

innodb和myisam存储引擎插入速度

--innodb和myisam存储引擎插入速度 ------------------------------------2014/05/21 MySQL 5.6 全部默认设置,插入数据9999条,性能一般的虚拟机. mysql> delete from test; Query OK, 10000 rows affected (0.54 sec) mysql> alter table test engine=myisam; Query OK, 0 rows affected (0.15 sec)

MYSQL 浅谈MyISAM 存储引擎

思维导图 介绍 mysql中用的最多存储引擎就是innodb和myisam.做为Mysql的默认存储引擎,myisam值得我们学习一下,以下是我对<高性能MYSQL>书中提到的myisam的理解,请大家多多指教. 特点 > 不支持事务 证明如下: >> 表记录:t2表的engine是myisam. >> 操作 注意:如果你在数据库进行事务操作,但是事务无法成功,你就要看你的表引擎了,看这种引擎是否支持事务. >> 下面请看innodb中的事务操作 &g

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

环境说明 mysql版本:Percona-Server-5.6.30 IP:10.7.15.167 端口:3306 安装目录:/httx/run/mysql 数据目录:/httx/run/mysql/data/ mysqldump的常用参数 mysqldump测试--–研究加–single_transaction参数的区别 开启general_log日志,跟踪mysql操作日志 (general_log日志可以方便跟踪所有mysql上的操作,但是生产环境不建议开启,占用资源.消耗内存) mysq

InnoDB和MyISAM存储引擎的区别

InnoDB存储引擎 InnoDB是一个事务型的存储引擎,设计目标是处理大数量数据时提供高性能的服务,它在运行时会在内存中建立缓冲池,用于缓冲数据和索引. InnoDB优点 1.支持事务处理.ACID事务特性: 2.实现了SQL标准的四种隔离级别: 3.支持行级锁和外键约束: 4.可以利用事务日志进行数据恢复. InnoDB缺点 1.不支持FULLTEXT类型的索引,因为它没有保存表的行数,当使用COUNT统计时会扫描全表. InnoDB适用场景 1.需要事务的操作: 2.更新数据需要使用行级锁

MySQL中常用的存储引擎(MyISAM 和InnoDB)

 数据库存储引擎是数据库底层软件组件,数据库管理系统(DBMS)使用存储引擎进行创建.查询.更新和删除数据操作.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能.现在许多的数据库管理系统都支持多种不同的存储引擎.MySQL的核心就是存储引擎. 使用 SHOW ENGINES; 命令查看MySQL支持的存储引擎,  Support 列表示某种引擎是否可以使用,YES表示可以,NO表示不可以,DEFAULT表示当前默认存储引擎. mysql> SH

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

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

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

MySQL数据库MyISAM存储引擎转为Innodb 之前公司的数据库存储引擎全部为MyISAM,数据量和访问量都不是很大,所以一直都没什么问题.但是最近出现了MySQL数据表经常被锁的情况,直接导致了用户连接网站时超时而返回502,于是决定把存储引擎转为Innodb的,以解决MyISAM的表锁问题.下面将操作步骤记录一下. 1.导出centos数据库的表结构 mysqldump -d -uxxx -p centos > centos_table.sql 其中-d参数表示不导出数据,只导出表结构

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

一文看懂mysql数据库本质及存储引擎innodb+myisam https://www.toutiao.com/i6740201316745740807/ 原创 波波说运维 2019-09-29 00:01:00 概述 今天主要讲下mysql数据库引擎的一些概念和mysql数据库本质,一句话总结: 文件夹-文件:一个数据库其实就是一个的文件夹,数据库里面的表就是文件夹里的一个或者多个文件(根据数据库引擎不同而不同,MyISAM是3个,InnoDB是2.5个) mysql的数据库其实就是存放在M