前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Java面试总结】MySQL

【Java面试总结】MySQL

作者头像
Rochester
发布2020-09-15 10:24:48
4740
发布2020-09-15 10:24:48
举报
文章被收录于专栏:牛人NR

MySQL

1. 什么是MySQL?

MySQL 是一种关系型数据库,其默认端口是 3306.

2. 字符集及校对规则

字符集指的是一种从二进制编码到某类字符符号的映射。校对规则则是指某种字符集下的排序个规则。

MySQL中每一种字符集都会对应一系列的校对规则。

MySQL采用的是类似继承的方式指定字符集的默认值,每个数据库以及每张数据表都有自己的默认值,它们逐层继承。比如:某个库中所有表的默认字符集将是该数据库所指定的字符集(这些表在没有指定字符集的情况下,才会采用默认字符集)

3. 什么是事务?

事务是逻辑上的一组操作,要么都执行,要么都不执行。

事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。

4. 事务的四大特性:

  • 原子性:事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么全部失败;
  • 一致性:执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
  • 隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库时独立的;
  • 持久性:一个事务被提交之后,它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

5. 并发事务带来哪些问题?

在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能导致以下的问题:

  • 脏读:当一个事务正在访问数据并对数据做出了修改,而这种修改还没有提交到数据库中,这么另外一个事务也访问到了这个数据,然后使用了这个数据。因为这个这个数据是还没有提交的数据,那么另一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。
  • 丢失修改:指在一个事务读取到一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也做出了修改。这样第一个事务的修改结果就被丢失,因此成为丢失修改。
  • 不可重复读:指一个事务内多次读取同一数据。在这个事务还没有结束时,另一个事务也访问不了这个数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此成为不可重复读。
  • 幻读:幻读与不可重复读类似。它发生在第一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时,在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以被称为幻读。

不可重复读和幻读的区别: 不可重复读的重点是修改比如多次读取一条记录发现其中的某些列的值被修改;幻读的重点在于新增或者删除比如多次读取一条记录发现记录增多或减少了。

6. 事务的隔离级别是什么?MySQL的默认隔离级别是什么?

SQL 标准定义了四个隔离级别:

  • READ-UNCOMMITTED(读取未提交):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
  • READ-COMMITTED(读取已提交):允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
  • REPEATABLE-READ(可重复读):对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
  • SERIALIZABLE(可串行化):最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

隔离级别

脏读

不可重复读

幻影读

READ-UNCOMMITTED(读取未提交)

READ-COMMITTED(读取已提交)

×

REPEATABLE-READ(可重复读)

×

×

SERIALIZABLE(可串行化)

×

×

×

MySQL InnoDB 存储引擎的默认支持的隔离级别是REPEATABLE-READ(可重读)

7. 大表优化

当 MySQL 单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下:

限定数据的范围:

务必禁止不带任何限制数据范围条件的查询语句。比如当我们在查询订单历史的时候,我们可以控制在一个月的范围内。

读/写分离

经典的数据库拆分方案,主库负责写,从库负责读

垂直分区

根据数据库里面数据表的相关性进行拆分。例如,用户表中既有用户的登录信息又有用户的基本信息,可以将用户表拆分成两个单独的表,甚至放到单独的库做分库。

简单来说垂直拆分是指数据表列的拆分**,把一张列比较多的表拆分为多张表**。如下图所示

  • 垂直拆分的优点:可以使得列数据变小,在查询时减少读取的Block数,减少I/O次数。此外,垂直分区可以简化表的结构,易于维护。
  • 垂直拆分的缺点:主键会出现冗余,需要管理冗余列,并会引起Join操作,可以通过在应用层进行Join来解决。此外,垂直分区会让事务变得更加复杂;

水平分区

保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。水平拆分可以支撑非常大的数据量。

水平拆分是指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。举个例子:我们可以将用户信息表拆分成多个用户信息表,这样就可以避免单一表数据量过大对性能造成影响。

水平拆分可以支持非常大的数据量。需要注意的一点是:分表仅仅是解决了单一表数据过大的问题,但由于表的数据还是在同一台机器上,其实对于提升MySQL并发能力没有什么意义,所以水平拆分最好分库

8. 分库分表之后,id 主键如何处理?

因为要是分成多个表之后,每个表都是从 1 开始累加的,这样是不对的,我们需要一个全局唯一的 id 来支持。

生成全局 id 有下面这几种方式:

  • UUID:不适合作为主键,因为太⻓了,并且无序不可读,查询效率低。比较适合用于生成唯一的名字的标示比如文件的名字。
  • 数据库自增 id : 两台数据库分别设置不同步⻓,生成不重复ID的策略来实现高可用。这种方式生成的 id 有序,但是需要独立部署数据库实例,成本高,还会有性能瓶颈。
  • 利用 redis 生成 id :性能比较好,灵活方便,不依赖于数据库。但是,引入了新的组件造成系统更加复杂,可用性降低,编码更加复杂,增加了系统成本。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MySQL
    • 1. 什么是MySQL?
      • 2. 字符集及校对规则
        • 3. 什么是事务?
          • 4. 事务的四大特性:
            • 5. 并发事务带来哪些问题?
              • 6. 事务的隔离级别是什么?MySQL的默认隔离级别是什么?
                • 7. 大表优化
                  • 限定数据的范围:
                  • 读/写分离
                  • 垂直分区
                  • 水平分区
                • 8. 分库分表之后,id 主键如何处理?
                相关产品与服务
                云数据库 SQL Server
                腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档