数据库
oracle数据库自启动和关闭脚本调用
数据库灾备恢复小结
DMS使用文档
Oracle12C安装文档_李光升
Centos配置yum源的操作步骤-李光升
CCS数据库突然卡顿问题解决-徐铭
Centos 7.9静默安装oracle 12cR2详细步骤
mysql5.7数据库sql语句数据类型隐式转换的反逻辑BUG
RDS MySQL临时文件导致实例磁盘空间满且出现“锁定中”状态
关于Mysql引擎Myisam和InnoDB的使用
MySQL查询语句中in和exists区别详解-知识点
Mysql 的存储过程中 WITH AS 的语法和使用
Mysql 性能调优-详解
oracle数据库DG搭建
SUSE linux 配置时钟同步服务NTP/Chrony
oracle数据库实例开启操作文档
oracle数据库实例关闭操作文档
oracle数据库DBS备份配置文档v2
ALiYun ECS CENTOS数据上传到OSS操作手册
Oracle - LOGMINER配置方法
oracle sysaux表空间爆满清理unified auditing数据
sysaux表空间爆满WRI$_ADV_OBJECTS占用严重
SAP权限对象
SYSAUX表空间WRI$\_ADV\_OBJECTS表过大清理V2
oracle:表访问方式
ORA性能诊断调优
数据字典(DICT)和性能事件类型(EVENT)
日志挖掘LogMiner
RMAN sql_id “0az7czjdw8z7j” 执行计划异常
Oracle11g Active Data Guard搭建、管理
ORACLE LOGMINER配置v2
oracle日志组调整
ECS linux服务器挂载nas磁盘失败
oracle数据库修改字符集
datapump数据泵导入导出
OA系统数据库ADG架构搭建
IPS数据库SQL执行异常:ORA-00600
oracle 12c 创建PDB
oracle数据库监听异常
lvm:阿里云磁盘扩容,lvm扩容
Redis基本操作
SAP S4 CLIENT COPY(800->400)
日常数据库操作
PGSQL操作
# ORA-00054: resource busy问题处理
OA数据库服务器故障分析报告
CCS数据库生产数据库(北京中心)覆盖到VER环境数据库(乌兰察布):使用nonpdb to pdb迁移方式
WINDOWS环境Django框架连接MySQL数据库配置
Django开发学习实战
什么是向量嵌入?
OA数据库服务器内次异常增长问题分析
基于AI的自动化服务器管理
AI技术发展趋势及其在农牧食品行业的创新应用
IPS数据库日志表数据归档&表分区
国产编程模型GLM-4.6海外爆火:性能媲美ClaudeSonnet,性价比优势显著
免费开源的零代码平台 / 无代码平台,敲敲云 v2.2.0 版本
数据库原理与应用
AI发展近况分析
ORACLE ADG环境下解除ADG关系并激活备库为独立数据库
麦肯锡重磅报告:关于未来的生存指南,当57%的工作被自动化,我们如何与AI结成利益共同体
【Oracle】Cursor(游标)
ORACLE数据库在曾经的备库(路径一致)进行不完全恢复
获取执行计划的6种方法
人工智能行业的发展已进入“系统竞争”时代
2026年AI与机器人发展趋势
事务未提交导致行锁等待问题处理
MongoDB日常操作命令
2026年人工智能前沿技术趋势与应用落地分析
Doris开发
人工智能在数据库运维工作中的应用趋势与落地场景研究
帆软报表开发学习
AI 助手在 Oracle DBA 工作中的辅助能力研究报告
AI原生数据库发展趋势白皮书
OpenClaw数据库管理应用实践
Apache Doris 简介
AI在实际工作中的应用案例分享
人形机器人现状
从十大AI技术趋势,窥见“未来”
AI 在辅助投资股票方面的落地方案与实际使用价值
从原理到实践,一文读懂主流 AI 技术
AI Agent 从零开始学习路线图
AI 驱动的内容生产工作流探索 —— 基于微信公众号文章编写与视频号视频生成的实践
本文档使用「觅思文档专业版」发布
-
+
首页
关于Mysql引擎Myisam和InnoDB的使用
关于Mysql的引擎MyIsam和InnoDB **1. Mysql有哪些引擎** 1.1 **引擎简介** *MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。* 1.MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎。 2.MEMORY存储引擎提供"内存中"表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样,MEMORY和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。 注释:MEMORY存储引擎正式地被确定为HEAP引擎。 2.InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里,你可以按照喜好通过配置MySQL来允许或禁止任一引擎。 3.EXAMPLE存储引擎是一个"存根"引擎,它不做什么。你可以用这个引擎创建表,但没有数据被存储于其中或从其中检索。这个引擎的目的是服务,在 MySQL源代码中的一个例子,它演示说明如何开始编写新存储引擎。同样,它的主要兴趣是对开发者。 4.NDB Cluster是被MySQL Cluster用来实现分割到多台计算机上的表的存储引擎。它在MySQL-Max 5.1二进制分发版里提供。这个存储引擎当前只被Linux, Solaris, 和Mac OS X 支持。在未来的MySQL分发版中,我们想要添加其它平台对这个引擎的支持,包括Windows。 5.ARCHIVE存储引擎被用来无索引地,非常小地覆盖存储的大量数据。 6.CSV存储引擎把数据以逗号分隔的格式存储在文本文件中。 7.BLACKHOLE存储引擎接受但不存储数据,并且检索总是返回一个空集。 8.FEDERATED存储引擎把数据存在远程数据库中。在MySQL 5.1中,它只和MySQL一起工作,使用MySQL C Client API。在未来的分发版中,我们想要让它使用其它驱动器或客户端连接方法连接到另外的数据源 另外,MySQL支持数个存储引擎作为对不同表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎。 1. 常用引擎MyISAM 和 InnoDB区别 类别 MyISAM InnoDB **构成上的区别:** 每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。 .frm文件存储表定义。 数据文件的扩展名为.MYD (MYData)。 索引文件的扩展名是.MYI (MYIndex)。 基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB **事务处理上方面:** MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持 InnoDB提供事务支持事务,外部键(foreign key)等高级数据库功能 **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特性(例如外键)的表不适用 **对AUTO\_INCREMENT的操作** 每表一个AUTO\_INCREMEN列的内部处理。 **MyISAM为INSERT和UPDATE操作自动更新这一列**。这使得AUTO\_INCREMENT列更快(至少10%)。在序列顶的值被删除之后就不能再利用。(当AUTO\_INCREMENT列被定义为多列索引的最后一列,可以出现重使用从序列顶部删除的值的情况)。 AUTO\_INCREMENT值可用ALTER TABLE或myisamch来重置 对于AUTO\_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引 更好和更快的auto\_increment处理 如果你为一个表指定AUTO\_INCREMENT列,在数据词典里的InnoDB表句柄包含一个名为自动增长计数器的计数器,它被用在为该列赋新值。 自动增长计数器仅被存储在主内存中,而不是存在磁盘上 **表的具体行数** select count(*) from table,MyISAM只要简单的读出保存好的行数,注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的 InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行 **锁** 表锁 提供行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs),另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表, 例如update table set num=1 where name like "%aaa%" **InnoDB**:MySQL默认的事务型引擎,也是最重要和使用最广泛的存储引擎。它被设计成为大量的短期事务,短期事务大部分情况下是正常提交的,很少被回滚。InnoDB的性能与自动崩溃恢复的特性,使得它在非事务存储需求中也很流行。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。 **MyISAM**:在MySQL 5.1 及之前的版本,MyISAM是默认引擎。MyISAM提供的大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM并不支持事务以及行级锁,而且一个毫无疑问的缺陷是崩溃后无法安全恢复 下面我们分别来看两种存储引擎的区别。 * 一、InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。 * 二、MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用 * 三、InnoDB支持外键,MyISAM不支持 * 四、MySQL 在 5.1 之前版本默认存储引擎是 MyISAM,5.1 之后版本默认存储引擎是 InnoDB * 五、InnoDB不支持FULLTEXT类型的索引 * 六、InnoDB中不保存表的行数,如select count(*) from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含where条件时MyISAM也需要扫描整个表 * 七、对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引 * 八、清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表 * 九、InnoDB支持行锁(某些情况下还是锁整表,如 **update table set a=1 where user like '%lee%'** * MYISAM和INNODB是Mysql数据库提供的两种存储引擎。两者的优劣可谓是各有千秋。INNODB会支持一些关系数据库的高级功能,如事务功能和行级锁,MYISAM不支持。MYISAM的性能更优,占用的存储空间少。所以,选择何种存储引擎,视具体应用而定。 * 如果你的应用程序一定要使用事务,毫无疑问你要选择INNODB引擎。但要注意,INNODB的行级锁是有条件的。在where条件没有使用主键时,照样会锁全表。比如DELETE FROM mytable这样的删除语句。 * 如果你的应用程序对查询性能要求较高,就要使用MYISAM了。MYISAM索引和数据是分开的,而且其索引是压缩的,可以更好地利用内存。所以它的查询性能明显优于INNODB。压缩后的索引也能节约一些磁盘空间。MYISAM拥有全文索引的功能,这可以极大地优化LIKE查询的效率。 * 有人说MYISAM只能用于小型应用,其实这只是一种偏见。如果数据量比较大,这是需要通过升级架构来解决,比如分表分库,而不是单纯地依赖存储引擎。 现在一般都是选用innodb了,主要是myisam的全表锁,读写串行问题,并发效率锁表,效率低myisam对于读写密集型应用一般是不会去选用的。 * 关于Mysql数据库默认的存储引擎: * MyISAM和InnoDB是MySQL的两种存储引擎。如果是默认安装,那就应该是InnoDB,你可以在my.ini文件中找到default-storage-engine=INNODB;当然你可以在建表时指定相应的存储引擎。通过show create table xx 可以看见相应信息。 1. MYISAM和INNODB区别的总结 #### 事务 **InnoDB**:支持 **MyISAM**:不支持 #### 锁 **InnoDB**:支持行锁、表锁。行锁是实现在索引上的,如果没有索引,就没法使用行锁,将退化为表锁。 **MyISAM**:支持表锁。 #### 主键 **InnoDB**:必须有,没有指定会默认生成一个隐藏列作为主键 **MyISAM**:可以没有 #### 索引 **InnoDB**:聚集索引,使用 B+ 树作为索引结构,数据文件和索引绑在一起,必须要有主键。主键索引一次查询;辅助索引两次查询,先查询主键,再查询数据; **MyISAM**:非聚集索引,使用 B+ 树作为索引结构,索引和数据文件是分离的。主键索引和辅助索引是独立的。 #### 外键 **InnoDB**:支持 **MyISAM**:不支持 #### AUTO\_INCREMENT **InnoDB**:必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。 **MyISAM**:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。 #### 数据库文件 **InnoDB**:frm是表定义文件,ibd是数据文件。支持两种存储方式: * 共享表空间存储:所有表的数据文件和索引都保存在一个表空间里,一个表空间可以有多个文件,通过 innodb\_data\_file\_path 和 innodb\_data\_home\_dir 参数设置共享表空间的位置和名字,一般共享表空间的名字叫 ibdata1-n。 * 多表空间存储:每个表都有一个表空间文件用于存储每个表的数据和索引,文件名以表名开关,以.ibd为扩展名 **MyISAM**:frm是表定义文件,myd是数据文件,myi是索引文件。支持三种存储格式:静态表(默认,注意数据末尾不能有空格,会被去掉。)、动态表、压缩表。 #### 表的行数 **InnoDB**:没有保存。select count(*) from table;会扫描全表。 **MyISAM**:保存。select count(*) from table;会直接取出该值。 注:但加了 where 条件后,两者处理方式一样,都是扫描全表。 #### 全文索引 **InnoDB**:5.7及以后版本支持。 **MyISAM**:支持。 #### 总结 **InnoDB**: * 优点:支持事务,支持外键,并发量较大,适合大量 update。 * 缺点:查询数据相对较快,不适合大量的 select。 **MyISAM**: * 优点:查询数据相对较快,适合大量的 select,可以全文索引。 * 缺点:不支持事务,不支持外键,并发量较小,不适合大量 update。 1. 项目中MYISAM和INNODB该如何选择 * 你的数据库有外键吗?如有,选择 **InnoDB**。 * 你需要事务支持吗?如需要,选择 **InnoDB**。 * 你需要全文索引吗?在5.7及以后版本,**都可选**,优先考虑 **InnoDB** * 你经常使用什么样的查询模式?如果表中绝大多数都只是读查询,可以考虑 **MyISAM**,如果既有读写也挺频繁,请使用 **InnoDB**。 * 你的数据有多大?数据量大,选择 **InnoDB**,因为其支持事务处理和故障恢复。MyISAM 可能需要几小时或几天来恢复,InnoDB 只需要几分钟。 * 你需要在线热备份吗?如需要,选择 **InnoDB**。
mysql
李光升
2022年10月24日 15:51
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
Word文件
PDF文档
PDF文档(打印)
分享
链接
类型
密码
更新密码
有效期