前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL 中 MyISAM 中的查询为什么比 InnoDB 快?

MySQL 中 MyISAM 中的查询为什么比 InnoDB 快?

作者头像
业余草
发布2019-03-11 14:08:35
9.6K0
发布2019-03-11 14:08:35
举报
文章被收录于专栏:业余草业余草

哎呀,一年之计在于春啊。最近过完年了,微信群里有非常多的小伙伴在问我一下面试方面的问题。比如:有让我出题的,有让我推荐资料的,还有让我推荐公司的。。。

真是太难为我了!也有些人刚开过年,任务不算多。所以,经常酱油,不知道该学习什么?

于是,我发了一套面试题,如下:

640?wx_fmt=png
640?wx_fmt=png

结果,他们都来要答案了。哎,做伸手党可不好,什么时候才能独立呢?所以,我一一的拒绝了他们。

关于这套面试题,有很多内容,我都写过文章的!今天,我们来写一写第 14 小题。为什么 MyisAM 查询快?

640
640

关于,这个问题,我网上看了很多答案。大多内容都雷同,但是我要强调的是,并不是说 MYISAM 一定比 InnoDB 的 select 快。

其实呢?MyISAM 适合读多,并发少的场景;这个问题要分场景来看。不同的场景,还真不能说 MyISAM 比 InnoDB 中的查询快!

下面我们一起来看看 Innodb 和 Myisam 的 5 大区别:

640
640

上面的“事务”写错了。不过,我相信大家能看明白其中的解释。

关于“行锁”还是“表锁”,可以看我的这篇文章《InnoDB 的 select 行锁还是表锁》。

关于 count 的区别,可以看我的这篇文章《你真的懂 select count(*) 吗?》。

那么为什么大家喜欢说 MyisAM 查询快呢?那是因为,InnoDB 的表是根据主键进行展开的 B+tree 的聚集索引。MyIsam 则非聚集型索引,myisam 存储会有两个文件,一个是索引文件,另外一个是数据文件,其中索引文件中的索引指向数据文件中的表数据。

聚集型索引并不是一种单独的索引类型,而是一种存储方式,InnoDB 聚集型索引实际上是在同一结构中保存了 B+tree 索引和数据行。当有聚簇索引时,它的索引实际放在叶子页中。

640
640

结合上图,可以看出:INNODB 在做 SELECT 的时候,要维护的东西比 MYISAM 引擎多很多。

640?wx_fmt=png
640?wx_fmt=png

InnoDB:通过为每一行记录添加两个额外的隐藏的值来实现 MVCC,这两个值一个记录这行数据何时被创建,另外一个记录这行数据何时过期(或者被删除)。但是 InnoDB 并不存储这些事件发生时的实际时间,相反它只存储这些事件发生时的系统版本号。这是一个随着事务的创建而不断增长的数字。每个事务在事务开始时会记录它自己的系统版本号。每个查询必须去检查每行数据的版本号与事务的版本号是否相同。让我们来看看当隔离级别是 REPEATABLEREAD 时这种策略是如何应用到特定的操作的:

SELECT InnoDB 必须每行数据来保证它符合两个条件:

640?wx_fmt=png
640?wx_fmt=png

说白了,为什么现在一些人喜欢 NoSQL 呢?因为 nosql 本身似乎应该是以省去解析和事务锁的方式来提升效能。MYISAM 不支持事务,也是它查询快的一个原因!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年02月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档