博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【大话Mysql面试】-MYSQL的两种存储引擎MyISAM与InnoDB的区别是什么?
阅读量:1886 次
发布时间:2019-04-26

本文共 1505 字,大约阅读时间需要 5 分钟。

MYSQL的两种存储引擎MyISAM与InnoDB的区别是什么?

1. MyISAM与InnoDB关于锁方面的区别是什么?

  • MyISAM默认用的是表级锁,不支持行级锁;
  • InnoDB默认用的是行级锁,也支持表级锁。

2. MyISAM和InnoDB适合的场景有哪些?

  • MyISAM适合的场景
    • 频繁执行全表count语句;
    • 对数据进行增删改的频率不高,查询非常频繁
    • 没有事务;
  • InnoDB适合的场景
    • 数据增删改查都相当频繁
    • 可靠性要求比较高,要求支持事务;

3. MyISAM和InnoDB引擎的区别是什么?

  • InooDB支持事务MyISAM不支持事务;
  • InnoDB支持外键MyISAM不支持;
  • InnoDB是聚集索引MyISAM是非聚集索引;
  • InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描,而MyISAM用一个变量保存了整个表的行数,执行上述语句只需读出该变量即可,速度很快。
  • InooDB最小的锁粒度是行锁MyISAM最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。

4.MyISAM和InnoDB索引的区别是什么?

MyISAM索引和InnoDB索引实现:

(1) MyISAM索引实现:

非聚集性索引

a.主键索引

MyISAM引擎使用B+树作为索引结果,叶子结点的data域存放的是数据记录的地址。下图为MyISAM表的主索引,Col1为主键。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WkphofRl-1615527727202)(E:/笔记/JAVA/Java复习框架-数据库/Mysql/imgs_mysql/19.png)]

b.辅助索引

在MyISAM中,主索引和辅助索引在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。下图在Col2上建议一个辅助索引。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aySwKq5M-1615527727206)(E:/笔记/JAVA/Java复习框架-数据库/Mysql/imgs_mysql/20.png)]

同样是一棵B+树,data域保存数据记录的地址。因此,MYISAM中索引检索的算法为首先按照B+ Tree搜索算法搜索索引,如果指定的key存在,则取出其data域的值,然后 以data域的值为地址,读取相应数据记录。

(2) InnoDB

聚集性索引

a.主键索引

同样是B+树,实现方式却完全不同。InnoDB表数据文件本身就是一个索引结构,树的叶节点data域保存了完整的数据记录,这种索引叫做聚集索引

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k96FWFMh-1615527727207)(E:/笔记/JAVA/Java复习框架-数据库/Mysql/imgs_mysql/21.png)]

因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则mysql会自动选择一个可以唯一标识数据记录的列作为主键。如果不存在这种列,则mysql自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整型。

b.辅助索引

nnoDB的所有辅助索引都引用主键作为data域。下图为定义在Col3上的一个辅助索引

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RxQCqf5Y-1615527727211)(E:/笔记/JAVA/Java复习框架-数据库/Mysql/imgs_mysql/22.png)]

因此InnoDB 的索引能提供一种非常快速的主键查找性能。不过,它的辅助索引也会包含主键列,所以如果主键定义的比较大,其他索引也将很大。InnoDB 不会压缩索引。

聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

转载地址:http://ldwdf.baihongyu.com/

你可能感兴趣的文章
python基础爬虫 视频的下载
查看>>
python中把图片 或者 数据存储到本地 用csv方式储存
查看>>
python中csv格式转换为excle格式
查看>>
爬取图片下载保存 例子详解 代码与注释
查看>>
python 在安装第三方库时候 怎样使用国内镜像源 实现快速下载
查看>>
python 爬取龙岭迷窟视频 对于视频格式m3u8 下载多个ts文件 合并成MP4
查看>>
python 如果遇到爬取解析到得文本为 style="display: none" 没有找到相关内容该怎样解决 修改文本属性获取新的内容
查看>>
python 爬取百度地图api数据
查看>>
python 中virtualenv Virtualenvwrapper命令使用 虚拟环境在cmd创建怎样配置安装
查看>>
MySQL 数据库在dos命令下的基本操作
查看>>
MySQL 学习文档 和安装步骤
查看>>
在Scrapy中怎样把数据储存到Mysql 或者Redis中
查看>>
python 在爬虫中怎样把数据添加到excle样式中
查看>>
Scrapy框架介绍和简单创建使用
查看>>
python 爬虫中selenium 爬取数据 csv储存思路加代码
查看>>
python 爬虫 网易云音乐 抓取
查看>>
Django 项目基础的部署步骤流程
查看>>
Django restful framework (drf)环境配置 drf和Djano中的请求和响应的区别
查看>>
python 爬取天猫店铺商品评论
查看>>
python 斗鱼弹幕的爬取一(selenium)
查看>>