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和memory三个存储引擎的区别