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

文章讲述了InnoDB在MySQL5.7及后续版本中相对于MyISAM的性能优势,包括更好的并发处理、ACID事务支持、全文搜索和高可用性解决方案。作者建议如果关心数据完整性和追求现代应用需求,应考虑从MyISAM迁移到InnoDB。
摘要由CSDN通过智能技术生成

在我的印象里MyISAM查询的速度是比InnoDB快的,但最近在mysql官网看到一篇关于InnoDB与MyIsam相关的文章。

原文链接:https://blogs.oracle.com/mysql/post/still-using-myisam-it-is-time-to-switch-to-innodb

文章是这位大神写的,弗雷德里克·德斯坎普斯(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万行

详细报告可以参见:

DimitriK's (dim) Weblog : MySQL Performance: Re:Visiting InnoDB vs MyISAM with MySQL 5.7

测试报告:

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

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栈江湖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值