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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 在我印象中,MyISAM的查询速度比InnoDB快,但根据MySQL官网文章,从5.7版本开始,InnoDB性能大幅提升,在8.0中持续优化。InnoDB提供更好的性能、可靠性和可扩展性,支持ACID事务、行级锁定、崩溃恢复等特性,成为现代应用的默认选择。尤其在高可用性和灾难恢复方面,InnoDB是唯一选择。云服务也普遍不支持MyISAM。因此,建议使用MyISAM的用户尽早迁移到InnoDB以获得更佳性能和可靠性。

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

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


添加图片注释,不超过 140 字(可选)


文章是这位大神写的,弗雷德里克·德斯坎普斯(MySQL社区经理)他从事开源和 MySQL 咨询工作已有近 20 年。


添加图片注释,不超过 140 字(可选)


大概的意思:

从 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更快,同时文中也给出来相关的性能测试证明:


添加图片注释,不超过 140 字(可选)



接下来我们来研究一下:

一、默认引擎

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万行



添加图片注释,不超过 140 字(可选)


详细报告可以参见:

http://dimitrik.free.fr/blog/archives/2015/12/mysql-performance-revisiting-innodb-vs-myisam-with-mysql-57.html

测试报告:

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

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
8月前
|
存储 安全 关系型数据库
|
8月前
|
存储 缓存 关系型数据库
MySQL - 存储引擎MyISAM和Innodb
MySQL - 存储引擎MyISAM和Innodb
107 0
|
3月前
|
存储 关系型数据库 MySQL
什么是MyISAM和InnoDB
【10月更文挑战第17天】什么是MyISAM和InnoDB
68 0
|
8月前
|
存储 关系型数据库 MySQL
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
1779 0
|
13天前
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
27天前
|
存储 关系型数据库 MySQL
Mysql索引:深入理解InnoDb聚集索引与MyisAm非聚集索引
通过本文的介绍,希望您能深入理解InnoDB聚集索引与MyISAM非聚集索引的概念、结构和应用场景,从而在实际工作中灵活运用这些知识,优化数据库性能。
117 7
|
1月前
|
存储 关系型数据库 MySQL
MySQL引擎InnoDB和MyISAM的区别?
InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
59 9
|
2月前
|
安全 关系型数据库 数据库
MyISAM和InnoDB的区别
InnoDB支持事务,MyISAM不支持 InnoDB支持外键,MyISAM不支持 InnoDB是聚簇索引,MyISAM是非聚簇索引 InnoDB支持行锁和表锁,MyISAM只支持表锁;【并发情况下,InnoDB性能更牛,默认一锁只会锁住一行数据】 InnoDB不支持全文索引,MyISAM支持 InnoDB支持自增和MVCC模式的读写,MyISAM不支持 InnoDB支持支出数据库异常崩溃后的安全恢复,MyISAM不支持【崩溃后,重启会保证数据恢复到崩溃前状态。这个恢复的过程依赖于redo.log】
|
8月前
|
存储 SQL 关系型数据库
MySQL存储引擎之MyISAM和InnoDB
MySQL存储引擎之MyISAM和InnoDB
78 0
|
2月前
|
存储 算法 关系型数据库
InnoDB与MyISAM实现索引方式的区别
InnoDB和MyISAM均采用B+树索引,但在实现上有所不同。InnoDB的主键索引在叶子节点存储完整数据记录,辅助索引则存储主键值;而MyISAM的主键索引与数据文件分离,仅存数据地址,且主辅索引无区别,支持非唯一主索引。
49 1