数据库系列:MySQL引擎MyISAM和InnoDB的比较
1、数据库核心知识点
数据库系列:MySQL慢查询分析和性能优化
数据库系列:MySQL索引优化总结(综合版)
数据库系列:高并发下的数据字段变更
数据库系列:覆盖索引和规避回表
数据库系列:数据库高可用及无损扩容
数据库系列:使用高区分度索引列提升性能
数据库系列:前缀索引和索引长度的取舍
2、MySQL完整学习
MySQL全面瓦解30篇:合辑地址
1 比较和分析
MyISAM和InnoDB是两种不同的数据库存储引擎,它们在数据存储结构、事务支持、锁的支持、外键支持、主键观念、性能和优化方式等方面都存在明显的差异。
- 数据存储结构:MyISAM在磁盘上存储了三个文件,包括表的定义文件(.frm)、数据文件(.MYD)和索引文件(.MYI)。而InnoDB在磁盘上存储了两个文件,包括表的定义文件(.frm) 和 数据+索引文件(.ibd)。
- 事务支持:MyISAM不支持事务,而InnoDB支持事务,且有完善的锁、事务控制机制等功能。如需要执行大量的INSERT、UPDATE操作,InnoDB可以保证数据的一致性和完整性,提高多用户并发操作的性能。
- 锁的支持:MyISAM只支持表锁,效率相对较低。而InnoDB支持行锁,效率会高一些。执行大量SELECT查询时,MyISAM具有更好的性能,因它支持不加锁读取。在执行修改数据操作(UPDATE、DELETE)时,InnoDB行级锁可以减少锁定时间,提高并发性能。
- 主键观念:MyISAM可以不定义主键,如果定义了主键,则会是主键索引。而InnoDB必须要有主键,就算没有定义,那么会自动创建一个隐藏的6byte的int型的索引。
- 性能和优化:MyISAM适合执行大量的select操作,如阅读查询密集型的系统。而InnoDB适合执行大量的insert、update操作,如写入查询密集型的网站。
- 存储空间:MyISAM存储空间较小,而InnoDB需要更多的内存来存储。
- 对外键的支持:InnoDB支持外键,而MyISAM不支持。外键用于关联两个表的数据,使得两个表之间的关系更加清晰,同时也提高了数据的完整性。
总的来说,选择哪种存储引擎需要根据具体的应用场景来决定。
2 InnoDB在实践中的几点比较
2.1 数据计量:count(*)
MyISAM: MyISAM在执行COUNT(*)操作时,会扫描整个表,计算所有行的数量。由于MyISAM不支持事务和行级锁,因此在高并发环境下,多个客户端同时执行COUNT(*)操作可能会导致性能问题。但是如果查询中使用了索引,会使用索引来加速计算行数。
InnoDB: InnoDB在执行COUNT(*)操作时,会使用统计信息来估计行数,而不是扫描整个表。InnoDB支持事务和行级锁,通过在统计信息中维护行数统计,可以更快地执行COUNT(*)操作,提高性能。
如果查询中使用了索引,也不会使用索引来计算行数。这是因为统计信息是基于表数据,而不是基于索引。但是索引还是有益的,InnoDB会使用索引来加速满足查询条件的行的查找。
当加了where条件后,两种存储引擎的处理方式类似,都是根据条件来按照行扫描。
例如:
select count(*) from tb_userinfo where sex=0 and age > 22 ;
按照条件进行用户查询,两种存储引擎的处理方式类似,都是根据条件按照索引进行查询。
所以无论哪种存储引擎,建议都尽量建立好索引,并适当的通过where条件进行数据过滤。
2.2 全文索引
InnoDB5.6之前不支持全文索引,如果需要使用全文索引,可以使用Sphinx等搜索引擎。而MyISAM支持全文索引,这使得在文本搜索方面MyISAM具有更好的性能。
但是MySQL数据库本身不是为了全文检索而设计的,所以在数据量大并发量大的情况下,都不应该使用数据库自带的全文索引,会导致大量数据库资源和内存内损耗,更推荐的是使用类似 es、Sphinx等专业的全文检索引擎或组件。
2.3 事务机制
nnoDB支持事务,而MyISAM不支持。事务是一组数据库操作命令组成的程序逻辑单元,可以保证这组命令在执行过程中符合ACID特性(原子性、一致性、隔离性和持久性)。如果应用中需要执行大量的INSERT或UPDATE操作,使用InnoDB可以保证数据的一致性和完整性,提高多用户并发操作的性能
2.4 外键
InnoDB支持外键,而MyISAM不支持。外键用于关联两个表的数据,使得两个表之间的关系更加清晰,同时也提高了数据的完整性。
但是在数据量大并发量大的情况下,使用外键可能会导致性能瓶颈和死锁问题。
因此,为了提高性能和并发性,避免使用外键可能是一个更好的选择。在处理高度并发的场景时,可以考虑使用其他方法来管理数据的一致性和引用完整性,例如使用应用程序级别的逻辑或缓存等。
2.5 行锁与表锁
MyISAM只支持表级锁,而InnoDB支持行级锁。表级锁是加锁时对整张表进行加锁,行级锁是对表中的某一行进行加锁。因此,在执行大量SELECT查询时,MyISAM具有更好的性能,因为它支持不加锁读取。
然而,在执行需要修改数据的操作(如UPDATE、DELETE)的需求时,InnoDB的行级锁可以减少锁定时间和锁定的影响范围,提高并发性能。
我们在实际的业务场景中,绝大部分是读写混合的(基本都是读多写少),数据量和并发量只要上去了,都对性能有一定要求,所以还是推荐使用InnoDB。
需要注意的点是:尽量创建合适的索引,因为InnoDB的行锁是实现在索引上的,如果没有命中索引,就退化为表锁,那对并发性能反而有所降低。
举例如下:
# 表设计
tb_userinfo(id, username, age, sex, tel) innodb;
id PK # 主键默认建立索引
# 命中索引,执行行锁
update tb_userinfo set sex=0 where id=10086;
# 未命中索引,退化为表锁
update tb_userinfo set sex=0 where username='brand';
所以综上,InnoDB尽可能创建好合适的索引,否则锁粒度变成表锁,并发性能会受到很大的影响。
3 总结
总的来说,选择哪种存储引擎需要根据具体的应用场景来决定。如果需要执行大量的SELECT查询,且不需要事务支持,那么MyISAM可能一个选择。如果需要执行大量的INSERT或UPDATE操作,且需要事务支持、行级锁和外键支持,那么InnoDB可能是一个更好的选择。
在现有的互联网场景下,对大数据的处理要求很频繁,对高并发性能要求也很高,所以InnoDB是更优的选择。
数据库系列:MySQL引擎MyISAM和InnoDB的比较的更多相关文章
- Mysql引擎MyISAM和InnoDB的区别
InnoDB的数据存储在表空间中,表空间是由InnoDB管理的一个黑盒子,由一系列的数据文件组成.InnoDB可以将每个表的数据和索引存放在单独的文件中. InnoDB采用MVCC来支持高并发,并且实 ...
- MySQL中MyISAM和InnoDB两种主流存储引擎的特点
一.数据库引擎(Engines)的概念 MySQ5.6L的架构图: MySQL的存储引擎全称为(Pluggable Storage Engines)插件式存储引擎.MySQL的所有逻辑概念,包括SQL ...
- MySQL两种存储引擎: MyISAM和InnoDB
MySQL两种存储引擎: MyISAM和InnoDB 简单总结 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Me ...
- MySQL存储引擎 - Myisam和Innodb
Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比 MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个 文件的名字以表的名字开始 ...
- MySQL存储引擎MyISAM与InnoDB
一. MySQL存储引擎MyISAM与InnoDB如何选择 MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM.InnoDB.MERGE.MEMORY(HEAP).B ...
- MySQL存储引擎MyISAM和InnoDB,索引结构优缺点
MySQL存储引擎MyISAM和InnoDB底层索引结构 深入理解MySQL索引底层数据结构与算法 (各种索引结构优缺点) Myisam和Innodb索引实现的不同(存储结构) 存储引擎作用于什么对象 ...
- 关系型数据库(四),引擎MyISAM和InnoDB
目录 1.MyISAM和InnoDB关于锁方面的区别是什么 2.MYSQL的两个常用存储引擎 3.MyISAM应用场景 4.InnoDB适合场景 四.引擎MyISAM和InnoDB 1.MyISAM和 ...
- 【mysql中myisam和innodb的区别】
单击进入源网页 要点摘要: 1.查看mysql存储引擎的状态mysql> show engines; 2.查看mysql默认的存储引擎mysql> show variables like ...
- 关于MySQL的Myisam和Innodb的一些比较总结
总结一下MySQL的Myisam和Innodb引擎的一些差别,权当复习了. 首先二者在文件构成上: Myisam会存储三个文件:.frm 存储表结构,.MYD存储表的数据,.MYI文件存储表的索引:所 ...
- MySQL数据库系列(三)- MySQL常用引擎MyISAM和InnoDB区别详解
概述 InnoDB:在MySQL 5.5及之后的版本,InnoDB是MySQL默认的事务型引擎,也是最重要和使用最广泛的存储引擎.它被设计成为大量的短期事务,短期事务大部分情况下是正常提交的,很少被回 ...
随机推荐
- Mysql基础4-数据查询
一.DQL介绍 DQL全称:Data Query Language(数据查询语言),用来查询数据库中表的记录. 关键字:select 二.DQL语法 select 字段列表 from 表名列表 whe ...
- [Spring+SpringMVC+Mybatis]框架学习笔记(八):Mybatis概述
第8章 Mybatis概述 8.1 几个概念 ORM Object-Relationship Mapping 对象关系映射,它是一种思想,它的实质是将数据库中的数据用对象的形式表现出来. JPA Ja ...
- nacos适配达梦、瀚高、人大金仓数据库及部分源码探究
一.插件实现 1.插件目录结构 2.pom依赖 <dependency> <groupId>com.alibaba.nacos</groupId> <arti ...
- C++(继承)
继承 struct Person { int age; int sex; }; struct Teacher { int age; int sex; int level; int classId; } ...
- 快速入门OpenCv(python版)
OpenCV是一个(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时提供了Python. ...
- [go笔记]websocket入门
简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议.WebSocket让客户端和服务端之间的数据交换变得非常简单,且允许服务器主动向客户端推送数据,并且之后客户端和服务端所有的通信都 ...
- Java安全之Webshell免杀
Java安全之Webshell免杀 当遇到文件上传时,如果网站存在查杀软件,我们上传的一句话木马会被直接秒杀,这时候就需要做一下免杀,绕过查杀软件的检测. 思路 我的想法是先拆分,然后分别检验那些语句 ...
- CutLER:一种用于无监督目标检测和实例分割的方法
本文分享自华为云社区<CutLER:一种用于无监督目标检测和实例分割的方法>,作者:Hint. 目标检测是计算机视觉中的一种重要任务,使AI系统感知.推理.理解目标.训练定位模型需要特别的 ...
- 选择合适的方法进行API接口调试
随着互联网的快速发展,API(Application Programming Interface)接口在软件开发中扮演着重要的角色.调试API接口是确保系统正常运行的关键步骤之一.本文将介绍如何选择适 ...
- 2.2 PE结构:文件头详细解析
PE结构是Windows系统下最常用的可执行文件格式,理解PE文件格式不仅可以理解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,DOS头是PE文件开头的一个固定长度的结构体, ...