Mysql引擎 Innodb和MyISAM的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql引擎 Innodb和MyISAM的区别相关的知识,希望对你有一定的参考价值。

MYISAM 表是典型的数据与索引分离存储,主键和二级索引没有本质区别。比如在 MYISAM 表里主键、唯一索引是一样的,没有本质区别。
MYISAM 表的索引存储方式最大的缺点没有按照物理数据行顺序存储,这样无论对主键的检索还是对二级索引的检索都需要进行二次排序。
INNODB 表本身是索引组织表,也就是说索引就是数据。下图表T1的数据行以聚簇索引的方式展示,非叶子节点保存了主键的值,叶子节点保存了主键的值以及对应的数据行,并且每个页有分别指向前后两页的指针。
INNODB 表不同于 MYISAM,INNODB 表有自己的数据页管理,默认 16KB。MYISAM 表数据的管理依赖文件系统,比如文件系统一般默认 4KB,MYISAM 的块大小也是 4KB,MYISAM 表的没有自己的一套崩溃恢复机制,全部依赖于文件系统。
INNODB 表这样设计的优点有两个:
1. 数据按照主键顺序存储。主键的顺序也就是记录行的物理顺序,相比指向数据行指针的存放方式,避免了再次排序。
2. 两个叶子节点分别含有指向前后两个节点的指针,这样在插入新行或者进行页分裂时,只需要移动对应的指针即可。
但是也有缺点:
1. 二级索引由于同时保存了主键值,体积会变大。特别是主键设计不合理的时候,比如用 UUID 做主键。
2. 对二级索引的检索需要检索两次索引树。第一次通过检索二级索引叶子节点,找到过滤行对应的主键值;第二次通过这个主键的值去聚簇索引中查找对应的行。
参考技术A mysql数据库有多种存储引擎:比如:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE等等,最常见的也就是MyISAM和InnoDB了,下面主要讲解下MyISAM和InnoDB两种mysql数据库存储引擎的区别。
  MyISAM引擎是一种非事务性的引擎,提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用。MyISAM中,一个table实际保存为三个文件,.frm存储表定义,.MYD存储数据,.MYI存储索引。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎。
  MySQL服务器中的其他非事务性存储引擎(如MyISAM)遵从不同的数据完整性范例,称之为“原子操作”。按照事务术语,MyISAM表总能高效地工作在AUTOCOMMIT=1模式下。原子操作通常能提供可比较的完整性以及更好的性能。与经过优化调整的最快的事务性表相比,它的速度快3~5倍。由于MySQL服务器支持两种范例,因而你能决定是否利用原子操作的速度更好地服务于你的应用程序,或使用事务特性。该选择可按表进行。
  
  InnoDB则是一种支持事务的引擎。给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。所以的数据存储在一个或者多个数据文件中,支持类似于Oracle的锁机制。一般在OLTP应用中使用较广泛。如果没有指定InnoDB配置选项,MySQL将在MySQL数据目录下创建一个名为ibdata1的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的日志文件。
  InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读。这些特色增加了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。
  InnoDB是为处理巨大数据量时的最大性能设计。它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。
  InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。InnoDB也默认被包括在所有MySQL 5.1二进制分发版里。本回答被提问者采纳

存储引擎:MyISAM和InnoDB区别

MySQL采用插件式的存储引擎架构,将查询处理和其他的系统任务以及数据的存储提取相分离,可根据业务的需求选择合适的存储引擎

主流存储引擎:InnoDB,MyISAM

自mysql5.5之后,默认的存储引擎为InnoDB,之前默认的是MyISAM

 #查看当前mysql提供的存储引擎

mysql> show engines;


#查看当前默认的存储引擎

mysql> show variables like '%storage_engine%';

 

#设置默认的存储引擎

[root@cent8_yzil ~]# vim /etc/my.cnf

[mysqld]

default_storage_engine=InnoDB

 

#查看库中所有表使用的存储引擎

mysql[(none)]> show table status from mysql;

 

#查看库中指定表使用的存储引擎

mysql [mysql]> show table status like 'user'\\G

 

#设置表的存储引擎

create table tb_name(...) engine=InnoDB


注意:同一个库中的表建议使用同一种存储引擎类型

MyISAM引擎特点

1、不支持事务

2、表级锁定

3、读写相互堵塞,写入不能读,读时不能写

4、只缓存索引

5、不支持外键约束

6、不支持聚簇索引

7、读取数据较快,占用资源较少

8、不支持MVCC(多版本并发控制机制)高并发

MyISAM存储引擎适用场景

-只读(或者写很少)

-表较小(可以接受长时间进行修复操作)

MyISAM引擎文件

表名.frm    表格式定义

表名.MYD   数据文件

表名.MYI    索引文件

InnoDB引擎特点

1、行级锁

2、支持事务,适合处理大量短期事物

3、读写堵塞与事务级别相关

4、可缓存数据和索引

5、支持聚簇索引

6、崩溃恢复性更好

7、支持MVCC高并发

8、从mysql5.5后支持全文索引

InnoDB数据库文件

数据存储于“表空间中”:

所有InnoDB表的数据和索引放置于同一个表空间中

每个表单独使用一个表空间存储表的数据和索引

在配置文件中:innodb_file_per_table=on

数据文件:ibdata1,ibdata2,存放在datadir定义的目录下

表格式定义:表名.ibd,数据和索引文件

                      表名.frm,表结构定义文件

                      存放在datadir定义的每个数据库对应的目录下

总结:

     MyISAM更关注性能,存取速度快;

     InnoDB更关注事务,更安全。所谓事务,指多个操作被当作一个整体对待。比如:购物这个事务,包含下单、付款、收货等操作。如果中间一个操作出错,要回滚至初始状态。比如:付完款,商家没货,就要退款。

以上是关于Mysql引擎 Innodb和MyISAM的区别的主要内容,如果未能解决你的问题,请参考以下文章

mysql数据库引擎 MyISAM和 InnoDB区别

MYSQL数据库引擎 MYISAM和 INNODB区别

关系型数据库,引擎MyISAM和InnoDB

mysql中myisam,innodb和memory三个存储引擎的区别

深入理解MySql中Innodb引擎和MyIsam引擎的区别

Mysql存储引擎MyIsAM和InnoDB区别