java面经 MySQL 存储引擎--MyISAM和InnoDB的区别

这篇具有很好参考价值的文章主要介绍了java面经 MySQL 存储引擎--MyISAM和InnoDB的区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

存储引擎--MyISAM和InnoDB的区别

使用场景

对比

MySQL隔离级别--未提交读,提交读,可重复读,序列化

 隔离级别含义

隔离级别

英文名称

含义

脏读

复读

幻读

未提交读

READ UNCOMMITTED

可读取其它事务未提交的结果

提交读

READ COMMITTED

一个事务开始时,只能读到其他事务已经提交的修改。

例:如果A事务已经修改了XX,但还没提交,则B事务读XX时还是未修改的值。

Oracle等多数数据库默认是该级别)。

×

可重复读

REPEATABLE READ

在开启事务时,同一条件的查询返回的结果是一样的。

例:A事务开启,查询一条记录;B事务更新这条记录并提交,A事务再次查询这条记录(查到的结果跟第一次查到的一样,而不是B修改过的结果)。

MySQL默认级别

×

×

可序列化

SERIALIZABLE

 文章来源地址https://www.toymoban.com/news/detail-482813.html

当一个事务执行时,会对所涉及的数据行进行加锁,其他事务无法对这些数据行进行修改或读取,直到当前事务提交或回滚。

×

×

×

脏读、不可重复读、幻读的含义

java面经 MySQL
存储引擎--MyISAM和InnoDB的区别

      

索引的分类

java面经 MySQL
存储引擎--MyISAM和InnoDB的区别

java面经 MySQL
存储引擎--MyISAM和InnoDB的区别

索引的优点/缺点

优点

索引优点就是提高了查询性能,主要是以下几个方面

  1. 索引大大减少了服务器需要扫描的数据量。
  2. 索引可以帮助服务器避免排序和临时表。
  3. 索引可以将随机I/O 变为顺序I/O

缺点

  1. 降低了数据写入的效率。原因:当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护
  2. 索引增加了查询优化器的选择时间。查询优化器在对一条sql语句进行分析时,会结合一系列的分析计算出一条最优的查询sql。添加了索引之后,相当于是在原来的基础上,添加了对索引因素的分析,若在很多字段上创建了索引,会增加这个选择的时间。
  3. 索引占物理空间。除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

创建索引的原则

索引原则

说明/示例

对查询频率高的字段创建索引

        查询频率高的字段有:作为查询条件的字段(where子句中的列)、连接子句中指定的列

为经常需要排序、分组和联合操作的字段建立索引

经常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作会浪费很多时间。

        如果为其建立索引,可以有效地避免排序操作。

尽量使用唯一索引

          唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。  唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。

使用短索引

          如果索引的值很长,那么查询的速度会受到影响。例如,对一个CHAR(100)类型的字段进行全文检索需要的时间肯定要比对CHAR(10)类型的字段需要的时间要多。

使用前缀来索引

        如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。

索引的数目不要太多

过多的索引会导致insert、update、delete语句的执行效率降低;

每创建一个索引都会占用相应的物理空间;

对查询频率高的字段创建索引

        查询频率高的字段有:作为查询条件的字段(where子句中的列)、连接子句中指定的列

对查询频率高的字段创建索引

        查询频率高的字段有:作为查询条件的字段(where子句中的列)、连接子句中指定的列

java面经 MySQL
存储引擎--MyISAM和InnoDB的区别

索引失效的原因/解决方案

java面经 MySQL
存储引擎--MyISAM和InnoDB的区别

java面经 MySQL
存储引擎--MyISAM和InnoDB的区别

java面经 MySQL
存储引擎--MyISAM和InnoDB的区别

java面经 MySQL
存储引擎--MyISAM和InnoDB的区别

java面经 MySQL
存储引擎--MyISAM和InnoDB的区别

联合索引--使用/原理/优化

java面经 MySQL
存储引擎--MyISAM和InnoDB的区别

使用联合索引可以做到覆盖索引,从而避免会表查询。举个例子,从user表中查询用户id,姓名和性别,查询条件为姓名,这时候就可以对用户姓名和性别创建联合索引,这样可以做到覆盖查询和避免会表查询。

另一个场景是,如果存在多个查询条件,针对于查询字段建立联合索引,可以提高多个查询条件组合的查询性能。

索引的优化--LIKE模糊查询

聚集索引/辅助索引/回表查询/覆盖索引

回表查询,先查询辅组索引,再查询聚集索引。

覆盖索引,只用查询辅组索引或者聚集索引。

尽量将回表查询转换为覆盖查询,转换的方法为对要查询的字段建立联合索引,从而避免回表查询。

分库分表--垂直分表与水平分表

垂直(纵向)切分

垂直分库就是根据业务耦合性,将关联度低的不同表存储在不同的数据库,如下图。java面经 MySQL
存储引擎--MyISAM和InnoDB的区别

 

垂直分表是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中。

在字段很多的情况下(例如一个大表有100多个字段),通过"大表拆小表",更便于开发与维护,也能避免跨页问题,MySQL底层是通过数据页存储的,一条记录占用空间过大会导致跨页,造成额外的性能开销。

另外数据库以行为单位将数据加载到内存中,这样表中字段长度较短且访问频率较高,内存能加载更多的数据,命中率更高,减少了磁盘IO,从而提升了数据库性能。如下图。java面经 MySQL
存储引擎--MyISAM和InnoDB的区别

 

优缺点
优点:

解决业务系统层面的耦合,业务清晰
与微服务的治理类似,也能对不同业务的数据进行分级管理、维护、监控、扩展等
高并发场景下,垂直切分一定程度的提升IO、数据库连接数、单机硬件资源的瓶颈

缺点:

部分表无法join,只能通过接口聚合方式解决,提升了开发的复杂度
分布式事务处理复杂
依然存在单表数据量过大的问题(需要水平切分)

水平(横向)切分

  • 切分时机:当一个应用难以再细粒度的垂直切分,或切分后数据量行数巨大,存在单库读写、存储性能瓶颈,这时候就需要进行水平切分了。
  • 分类:水平切分分为库内分表分库分表,是根据表内数据内在的逻辑关系,将同一个表按不同的条件分散到多个数据库或多个表中,每个表中只包含一部分数据,从而使得单个表的数据量变小,达到分布式的效果。库内分表只解决了单一表数据量过大的问题,但没有将表分布到不同机器的库上,因此对于减轻MySQL数据库的压力来说,帮助不是很大,大家还是竞争同一个物理机的CPU、内存、网络IO,最好通过分库分表来解决。
  • java面经 MySQL
存储引擎--MyISAM和InnoDB的区别

优缺点

水平分库优点

  • 不存在单库数据量过大、高并发的性能瓶颈,提升系统稳定性和负载能力
  • 应用端改造较小,不需要拆分业务模块

水平分库缺点

  • 跨分片的事务一致性难以保证

  • 跨库的join关联查询性能较差

  • 数据多次扩展难度和维护量极大

 分片规则

  1. 取余/取模
    1. 均匀存放数据
    2. 缺点: 不能扩容
  2. 按照数量范围
    1. 1-500万      501万-1000万
  3. 按照日期范围
    1. 日志 ,订单信息,统计
  4. 按照月份
  5. 按照枚举值
    1. 常量
  6. 二进制取模范围
    1. 类似HashMap
    2. 缺点:数据存放不均匀
  7. 一致性hash分片           

典型的数据分片规则

1、根据数值范围

按照时间区间或ID区间来切分。例如:将userId为1~9999的记录分到第一个库,10000~20000的分到第二个库,以此类推。

优点

  1. 单表大小可控
  2. 天然便于水平扩展,后期如果想对整个分片集群扩容时,只需要添加节点即可,无需对其他分片的数据进行迁移
  3. 使用分片字段进行范围查找时,连续分片可快速定位分片进行快速查询,有效避免跨分片查询的问题。

缺点

热点数据成为性能瓶颈。连续分片可能存在数据热点,例如按时间字段分片,有些分片存储最近时间段内的数据,可能会被频繁的读写,而有些分片存储的历史数据,则很少被查询

2、根据数值取模

一般采用hash取模mod的切分方式,例如:将 Customer 表根据 id字段的hash值取模的余数切分到各个库中。这样同一个用户的数据会分散到同一个库中,如果查询条件带有id字段,则可明确定位到相应库去查询。

优点:数据分片相对比较均匀,不容易出现热点和并发访问的瓶颈。

缺点:

1、后期分片集群扩容时,需要迁移旧的数据。
2、容易面临跨分片查询的复杂问题。比如上例中,如果频繁用到的查询条件中不带id时,将会导致无法定位数据库,从而需要同时向4个库发起查询,分库反而成为拖累。

 

 

 

到了这里,关于java面经 MySQL 存储引擎--MyISAM和InnoDB的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL高级篇(存储引擎InnoDB、MyISAM、Memory)

    目录 1、存储引擎简介 1.1、查询建表语句,默认存储引擎:InnoDB 1.2、查看当前数据库支持的存储引擎 1.3、创建表,并指定存储引擎 2、 存储引擎-InnoDB介绍 2.1、存储引擎特点  3、MyISAM存储引擎  4、Memory存储引擎  5、InnoDB、MyISAM、Memory的区别  6、存储引擎的选择 介绍:In

    2024年04月11日
    浏览(41)
  • MySQL的三种存储引擎 InnoDB、MyISAM、Memory

    InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在 MySQL 5.5 之后,InnoDB是默认的MySQL 存储引擎。 DML操作遵循ACID模型,支持事务; 行级锁,提高并发访问性能; 支持外键FOREIGN KEY约束,保证数据的完整性和正确性; xxx.ibd:xxx代表的是表名,innoDB引擎的每张表都会对应这样

    2024年01月20日
    浏览(53)
  • 【MySQL】InnoDB和MyISAM区别详解(MySQL专栏启动)

    📫作者简介: 小明java问道之路 , 2022年度博客之星全国TOP3 ,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公司后端高级工程师。          📫 热衷分享,喜欢原

    2024年02月03日
    浏览(49)
  • ​​INNODB和MyISAM区别

    1 存储引擎是MyISAM 如下: CREATE table test_myisam (cli  int )   ENGINE=MyISAM 存储目录里会有三个文件 test_myisam.frm为“表定义”,是描述数据表结构的文件 test_myisam.MYI文件是表的索引 test_myisam.MYD文件是表的数据 2 存储引擎是INNODB CREATE table test_myisam_innodb (cli  int )   ENGINE=INNODB   test

    2024年02月08日
    浏览(83)
  • MySQL架构 & InnoDB存储引擎

    我们在开发的时候,我们都需要对业务数据进行存储,这个时候,你们就会用到MySQL 、O racal 等数据库。 MySQL它是一个关系型数据库, 这种关系型数据库就有Oracal 、 MySQL,以及最近很火的PgSQL 等。 那什么是关系型数据库呢? 就是它是 基于我们的SQL语句去执行操作的 。 其实

    2024年02月07日
    浏览(50)
  • MySQL—MySQL的存储引擎之InnoDB

    存储引擎 说明 MyISAM 高速引擎,拥有较高的插入,查询速度,但不支持事务 InnoDB 5.5版本后MySQL的默认数据库存储引擎,支持事务和行级锁,比MyISAM处理速度稍慢 ISAM MyISAM的前身,MySQL5.0以后不再默认安装 MRG_MyISAM 将多个表联合成一个表使用,在超大规模数据存储时很有用 Me

    2024年04月26日
    浏览(40)
  • 谈谈MySQL的InnoDB存储引擎

    大家好,我是易安! 今天我们谈一谈MySQL中InnoDB存储引擎。InnoDB存储引擎作为我们最常用到的存储引擎之一,充分熟悉它的的实现和运行原理,有助于我们更好地创建和维护数据库表。 InnoDB主要包括了内存池、后台线程以及存储文件。内存池又是由多个内存块组成的,主要包

    2024年02月03日
    浏览(37)
  • MySQL 的 InnoDB 存储引擎简介

    MySQL 是世界上最流行的开源关系型数据库管理系统之一,而其中的存储引擎则是其关键组成部分之一。InnoDB 存储引擎在 MySQL 中扮演了重要角色,提供了许多高级功能和性能优化,适用于各种应用程序和工作负载。本文将深入介绍 InnoDB 存储引擎的各个方面,以帮助您更好地理

    2024年02月08日
    浏览(42)
  • MySQL高级10-InnoDB引擎存储架构

    表空间(Tablespace):一个mysql实例,及一个数据库实例,可以对应多个表空间(ibd文件),用于存储记录,索引等数据。 段(Segment):分为数据段(Leaf node segment)、索引段(Non-leaf node segment)、回滚段(Rollback segment),InnoDB是索引组织表,数据段就是B+树的叶子节点(Leaf node segment),

    2024年02月08日
    浏览(42)
  • mysql--InnoDB存储引擎--架构和事务

    MySQL进阶篇 InnoDB 逻辑存储单元主层级关系图: 1、表空间 表空间是InnoDB存储引擎逻辑结构的最高层, 如果用户启用了参数 innodb_file_per_table(在 8.0版本中默认开启) ,则每张表都会有一个表空间(xxx.ibd),一个mysql实例可以对应多个表空间,用于存储记录、索引等数据。 2、段

    2024年02月14日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包