“COUNT(*) MyISAM比InnoDB更快”是误解

在我的印象里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万行

测试报告:

  1. MySQL 5.7中,InnoDB和MyISAM存储引擎在相同的工作负载和硬件环境下,性能都比之前有所提升。
  2. 40核心HT服务器的测试结果比32核心HT服务器的结果表现更好。
  3. 在最关键的Point-Select工作负载测试中,MyISAM只比InnoDB快一点点。这很容易理解,因为InnoDB支持事务,即使代码在可扩展性方面已经有了重大改进,事务开销依然存在。但这已经不是临时修复,而是经过重新设计的生产就绪代码。
  4. 在其他所有工作负载测试中,InnoDB的表现都比MyISAM更好。
  5. 对于使用单表的所有测试,InnoDB的速度都远远快于MyISAM,即使是Point-Select测试。

总的来说,MySQL 5.7对InnoDB和MyISAM存储引擎都进行了优化,提升了性能,特别是InnoDB在多数情况下的表现更加优秀。硬件配置也对性能有明显影响。

四、总结

从MyISAM迁移到InnoDB为MySQL数据库带来了巨大的好处。InnoDB提供了更好的性能、可靠性和可扩展性,使其成为现代应用程序的默认选择。如果您关心数据完整性并计划使用高可用性和灾难恢复功能,InnoDB是唯一可能的选择。

通过利用InnoDB的强大功能,如ACID事务支持、行级锁定、崩溃恢复、多线程并行处理等,您可以构建更加健壮和高效的应用程序。尽管迁移过程可能需要一些努力,但最终结果将使您的数据库更加可靠和高性能,为您的业务增加价值。

相关推荐
伏虎山真人2 分钟前
开源数据库 - mysql - mysql-server-8.4(gtid主主同步+ keepalived热切换)部署方案
数据库·mysql·开源
2401_857636393 分钟前
计算机课程管理平台:Spring Boot与工程认证的结合
java·spring boot·后端
也无晴也无风雨1 小时前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
FIN技术铺3 小时前
Redis集群模式之Redis Sentinel vs. Redis Cluster
数据库·redis·sentinel
内核程序员kevin4 小时前
在Linux环境下使用Docker打包和发布.NET程序并配合MySQL部署
linux·mysql·docker·.net
CodingBrother4 小时前
MySQL 中的 `IN`、`EXISTS` 区别与性能分析
数据库·mysql
kayotin4 小时前
Wordpress博客配置2024
linux·mysql·docker
2401_857610034 小时前
多维视角下的知识管理:Spring Boot应用
java·spring boot·后端
代码小鑫4 小时前
A027-基于Spring Boot的农事管理系统
java·开发语言·数据库·spring boot·后端·毕业设计
小小不董5 小时前
Oracle OCP认证考试考点详解082系列16
linux·运维·服务器·数据库·oracle·dba