【大话Mysql面试】-MySQL数据引擎
发布日期:2021-06-29 15:36:00 浏览次数:2 分类:技术文章

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

【大话Mysql面试】-MySQL数据引擎

存储引擎Storage engine:Mysql中的数据、索引以及其它对象是如何存储的,是一套文件系统的实现。

常用的存储引擎有以下:

  • Innodb引擎:Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。
  • MyIASM引擎(原本Mysql的默认引擎):不提供事务的支持,也不支持行级锁和外键。
  • MEMORY引擎:所有的数据都在内存中,数据的处理速度快,但是安全性不高。

MyISAM与InnoDB区别

MyISAM Innodb
存储结构 每张表被存放在三个文件:frm-表格定义、MYD(MYData)-数据文件、MYI(MYIndex)-索引文件 所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB
存储空间 MyISAM可被压缩,存储空间较小 InnoDB的表需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引
可移植性、备份及恢复 由于MyISAM的数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作 免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了
文件格式 数据和索引是分别存储的,数据.MYD,索引.MYI 数据和索引是集中存储的,.ibd
记录存储顺序 按记录插入顺序保存 按主键大小有序插入
外键 不支持 支持
事务 不支持 支持
锁支持(锁是避免资源争用的一个机制,MySQL锁对用户几乎是透明的) 表级锁定 行级锁定、表级锁定,锁定力度小并发能力高
SELECT MyISAM更优
INSERT、UPDATE、DELETE InnoDB更优
select count(*) myisam更快,因为myisam内部维护了一个计数器,可以直接调取。
索引的实现方式 B+树索引,myisam 是堆表 B+树索引,Innodb 是索引组织表
哈希索引 不支持 支持
全文索引 支持 不支持

3.1 MyISAM引擎与InnoDB引擎的区别?

MyIsam和InnoDB引擎的区别:

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

MyISAM索引和InnoDB索引实现:

(1) MyISAM索引实现:

非聚集性索引

a.主键索引

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

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

b.辅助索引

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

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

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

(2) InnoDB

聚集性索引

a.主键索引

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

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

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

b.辅助索引

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

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

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

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

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

MyIsam和InooDB应用场景

MyISAM:以读写插为主的应用程序,比如博客系统、新闻门户网站;

Innodb:更新(删除)操作频率也高,或者要保证数据的完整性;并发量高、支持事务和外键。比如OA自动化办公系统。

如何选择MyISam和InnoDB引擎?

  • 是否要支持事务,如果要选择InnoDB;如果不需要考虑MyISAM
  • 如果表中绝大数都只是读查询,可以考虑MyISAM;如果既考虑读也有写,请使用InnoDB。
  • 系统崩溃后,MyISAM恢复起来更困难,能否接受;
  • MySQL5.5 版本开始Innodb开始成为Mysql的默认引擎。

InnoDB为什么推荐使用自增ID作为主键?

自增ID可以保证每次插入时B+索引是从右边扩展的,可以避免B+树和频繁合并和分裂(对比使用UUID)。如果使用字符串主键和随机主键,会使得数据随机插入,效率比较差。

INNODB引擎的4大特性

插入缓冲 二次写 自适应哈希索引 预读

3.2 InnoDB引擎的4大特性

  • 插入缓冲(insert buffer)
  • 二次写(double write)
  • 自适应哈希索引(ahi)
  • 预读(read ahead)

3.3 存储引擎选择

如果没有特别的需求,使用默认的Innodb即可。

MyISAM:以读写插入为主的应用程序,比如博客系统、新闻门户网站。

Innodb:更新(删除)操作频率也高,或者要保证数据的完整性;并发量高,支持事务和外键。比如OA自动化办公系统。

转载地址:https://codingchaozhang.blog.csdn.net/article/details/115280298 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【大话Mysql面试】-常见SQL语句书写
下一篇:【大话Mysql面试】-MySQL数据类型有哪些

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月13日 03时13分33秒