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

SQL herman 575浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

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

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

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

1.HashSet实现原理?如何做到不重复?
2.HashMap实现原理?如何解决hash碰撞?
3.String为什么设计成final类?
4.ConcurrentHashMap实现原理?
5.AQS实现原理?独占锁和共享锁如何实现?
6.synchronized和ReentrantLock区别?
7.ReentrantLock如何实现?默认是公平锁还是非公平锁?公平锁和非公平锁内部是如何实现的?
8.线程的生命周期?blocked和waiting状态区别?
9.ThreadPoolExecutor参数说明,四种线程池的特点
10.如何用BlockingQueue实现生产和消费模式?LinkedBlockingQueue内部实现原理?
    其他方式实现生产消费模式(非MQ)?
11.Spring用到的设计模式,说一下实际的应用场景,其中一个设计模式的原理
12.Spring事件模型
13.Spring处理请求的流程,DispatcherServlet实现原理?
14.Mysql数据库引擎innodb myisam 区别,两种引擎的索引区别,为什么myisam查询快?
15.Mysql数据库事物隔离级别;脏读,幻读;
16.Sql优化
17.Redis持久化方式,RDB,AOF各自的优缺点和适应场景?
18.写一个二叉树,以及中序,后序,前序遍历
19.如用无锁的方式实现并发安全;

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

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

程序员面试

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

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

Innodb 和 Myisam 区别

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

Innodb 和 Myisam 区别

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

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

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

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

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

Innodb 和 Myisam 的索引结构

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

  1. 数据块,INNODB 要缓存,MYISAM 只缓存索引块,  这中间还有换进换出的减少;
  2. innodb 寻址要映射到块,再到行,MYISAM 记录的直接是文件的 OFFSET,定位比 INNODB 要快
  3. INNODB 还需要维护 MVCC 一致;虽然你的场景没有,但他还是需要去检查和维护 MVCC (Multi-Version Concurrency Control) 多版本并发控制。

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

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

  1. InnoDB 必须找到一个行的版本,它至少要和事务的版本一样老(也即它的版本号不大于事务的版本号)。这保证了不管是事务开始之前,或者事务创建时,或者修改了这行数据的时候,这行数据是存在的。
  2. 这行数据的删除版本必须是未定义的或者比事务版本要大。这可以保证在事务开始之前这行数据没有被删除。

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

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » MySQL 中 MyISAM 中的查询为什么比 InnoDB 快?