在我的印象里MyISAM查询的速度是比InnoDB快的,但最近在mysql官网看到一篇关于InnoDB与MyIsam相关的文章。
文章是这位大神写的,弗雷德里克·德斯坎普斯(MySQL社区经理)他从事开源和 MySQL 咨询工作已有近 20 年。
大概的意思:
从 MyISAM 迁移到 InnoDB 为您的 MySQL 数据库带来了显著的好处。InnoDB 提供更好的性能、可靠性和可扩展性,使其成为现代应用程序的默认选择。如果您关心您的数据并计划使用高可用性和灾难恢复,InnoDB 是唯一可能的选择。
中心思想:
- 从5.7开始,InnoDB更快
- 在8.0中InnoDB性能不断提高
- InnoDB 中整个事务层得到了极大的改进
- 原本临时表MyISAM 更好,在8中 磁盘内部临时表 只支持InnoDB
- 原本批量加载时MyISAM的性能优于InnoDB,禁用 InnoDB持久性后InnoDB更快
- 原本COUNT(*)MyISAM 的速度更快,现在情况已不再如此。在多核环境下InnoDB更快
- 从MySQL 5.6开始,InnoDB 支持全文搜索 (FTS),从那时起它的扩展能力比MyISAM好3倍
- 云管理的MySQL服务均不包含MyISAM。Oracle云基础设施中的MySQL数据库服务也是如此。
最终结论:
如果你还在使用MyISAM,那么是时候考虑迁移到 InnoDB 了
也就是InnoDB性能上比较MyISAM更快,同时文中也给出来相关的性能测试证明:
接下来我们来研究一下:
一、默认引擎
InnoDB自5.5版(2010年7月)以来一直是MySQL的默认存储引擎。
MySQL支持多种存储引擎,如支持事务和行级锁定的InnoDB(默认)、早期默认的不支持事务但访问速度快的MyISAM、内存存储的Memory引擎、逗号分隔符文本存储的CSV引擎、MySQL集群专用的NDB引擎等。不同的存储引擎在事务支持、锁机制、数据存储方式等方面有所差异,用户可根据应用场景的需求来选择合适的存储引擎。
二、InnoDB vs MyISAM
与 MyISAM 相比,InnoDB 具有以下几个优点:
- MVCC,
- 支持 ACID 事务,
- 行级锁定,
- 崩溃恢复能力,
- 外键,
- 热备份,
- 克隆
1、性能
总的来说,如果我们比较性能,从5.7开始,InnoDB更快,并且在8.0中InnoDB性能不断提高。
以前,在我们添加并行执行之前,COUNT(*)MyISAM 的速度更快。现在情况已不再如此。
InnoDB 的设计目的是利用多核 CPU,这意味着它可以使用多个核心进行并行处理,并在现代硬件上获得更好的性能。
p.s.这一条我们后面详细说明。
2、全文搜索
从 MySQL 5.6 开始,InnoDB 支持全文搜索 (FTS),从那时起,它的扩展能力比 MyISAM 好 3 倍。当然,在 MySQL 8.0 中,我们继续支持InnoDB FTS,并支持 CJK、ngram、mecab。
3、高可用性
MySQL InnoDB Cluster(用于HA)和InnoDB CluserSet(用于DR),都基于组复制并且需要InnoDB。
如果您正在寻找真正的高可用性和/或灾难恢复解决方案,MyISAM 根本不是一个选择。
4、云
云管理的 MySQL 服务均不包含 MyISAM。 Oracle 云基础设施中的 MySQL 数据库服务也是如此。
三、使用性能
前面都有讲到InnoDB在性能上有很大的提升,我看来看看这位DimitriK的测试报告。
DimitriK是一位专注于MySQL性能的专家,他在自己的博客上发布了许多关于MySQL性能优化、基准测试和内部工作原理的文章。他的全名是Dimitri Kravtchuk,在MySQL社区中非常活跃,经常分享深入的技术见解和实用的性能调优技巧。如果您对MySQL的性能优化感兴趣,DimitriK的博客是一个很好的资源。
测试环境
- HW config : 32cores-HT server (exactly the same I've used 3 years ago) and a newer 40cores-HT server (to observe a tendency)
- OS : the same Oracle Linux 6.5
- Test workloads :
-
- load level : 8, 16, 32, .. 1024 concurrent user sessions
- test cases: Sysbench OLTP_RO, RO Simple-Ranges, RO Distinct-Ranges, RO Point-Selects
- datasets : single table with 10M rows, 8 tables with 1M rows each
测试服务器配置:
- 32核心HT服务器 (与3年前使用的配置相同)
- 40核心HT服务器 (观察性能趋势)
操作系统:
- Oracle Linux 6.5
测试工作负载:
- 并发用户会话数量: 8、16、32...1024
- 测试用例: Sysbench OLTP_RO、RO Simple-Ranges、RO Distinct-Ranges、RO Point-Selects
- 数据集: 单表1000万行、8个表各100万行
测试报告:
- MySQL 5.7中,InnoDB和MyISAM存储引擎在相同的工作负载和硬件环境下,性能都比之前有所提升。
- 40核心HT服务器的测试结果比32核心HT服务器的结果表现更好。
- 在最关键的Point-Select工作负载测试中,MyISAM只比InnoDB快一点点。这很容易理解,因为InnoDB支持事务,即使代码在可扩展性方面已经有了重大改进,事务开销依然存在。但这已经不是临时修复,而是经过重新设计的生产就绪代码。
- 在其他所有工作负载测试中,InnoDB的表现都比MyISAM更好。
- 对于使用单表的所有测试,InnoDB的速度都远远快于MyISAM,即使是Point-Select测试。
总的来说,MySQL 5.7对InnoDB和MyISAM存储引擎都进行了优化,提升了性能,特别是InnoDB在多数情况下的表现更加优秀。硬件配置也对性能有明显影响。
四、总结
从MyISAM迁移到InnoDB为MySQL数据库带来了巨大的好处。InnoDB提供了更好的性能、可靠性和可扩展性,使其成为现代应用程序的默认选择。如果您关心数据完整性并计划使用高可用性和灾难恢复功能,InnoDB是唯一可能的选择。
通过利用InnoDB的强大功能,如ACID事务支持、行级锁定、崩溃恢复、多线程并行处理等,您可以构建更加健壮和高效的应用程序。尽管迁移过程可能需要一些努力,但最终结果将使您的数据库更加可靠和高性能,为您的业务增加价值。