java面试之MySQL数据库篇

文章目录

1.SQL分类

(1)DDL(Data Definition Language)数据库定义语言:create drop alter,对表结构的增删改

(2)DML(Data Manipulation Language)数据库操作语言:用来对数据库表中的数据进行增删改。

关键字:insert,delete,update等

(3)DQL(Data Query Language)数据查询语言:用来查询数据表中的记录(数据) ,关键字:select,where等

(4)DCL(Data Control Language)数据控制语言:grant授权、revoke撤销权限等。

(5)TCL(事务控制语言):commit提交事务,rollback回滚事务(TCL中的T是Transaction)

2.关系型数据库和非关系型数据库的区别

(1)关系型数据库都是用表来进行维护,所以格式一致,可以统一用SQL语言来进行操作

(2)关系型数据库都是表结构,所以灵活度不够,操作复杂的海量数据性能比较差

(3)虽然性能可能会比较慢,但是能做复杂的关联查询操作。比如一对一、一对多等。

2.并发事务带来的问题(脏读、不可重复读以及幻读),怎么解决?

(1)并发事务的问题

①脏读,一个事务读取到另一个事务尚未提交的改变(update,insert,delete),叫做脏读

②不可重复读,是指在事务1内,读取了一个数据,事务1还没有结束时,事务2也访问了这个数据,修改或删除了这个数据,并提交。紧接着,事务1又读取这个数据。由于事务2的修改,那么事务1两次读到的数据可能是不一样的,因此称为是不可重复读。

(事务1想读取开启事务那一刻的数据,结果却读到了修改或删除后的数据)

③幻读,是指在事务1内,读取了一个数据,事务1还没有结束时,事务2也访问了这个数据,添加了这个数据,并提交。紧接着,事务1又读取这个数据。由于事务2的添加,那么事务1两次读到的数据可能是不一样的,因此称为是幻读。

(事务1想读取事务开启那一刻的数据,结果却读到了添加后的数据)

(2)解决并发事务带来的问题的方案是对事务进行隔离,SQL标准定义的四个隔离级别为:

①读未提交: 最低的隔离级别,允许Transaction1读取Transaction2尚未提交的数据变更,可能会导致脏读、幻读以及不可重复读。

②读已提交: 要求Transaction1只能读取Transaction2已提交的修改。可以解决脏读,但是幻读或不可重复读仍有可能发生。

③可重复读: 确保Transaction1可以多次从一个字段中读取到相同的值,即Transaction1执行期间禁止

其它事务对这个字段进行更新。可以解决脏读和不可重复读,但幻读仍有可能发生。

④可串行化: 最高的隔离级别,完全服从 ACID 的隔离级别。所有的事

务依次逐 个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以解决脏读、不可重复读以及幻读。

注意:Oracle默认为读已提交,MySQL默认为可重复读

6.什么是索引?

索引用于去快速的根据某个列查询对应的行,是帮助MySQL高效获取数据的数据结构。如果没有索引,MySQL必须从第一行开始,然后读取整个表以找到相关的行。表越大,花费时间就越多。如果表中有相关列的索引,MySQL就可以快速确定数据文件中间要查找的位置,而不必查看所有数据。这比按顺序读取每一行要快得多。

7.B+tree索引跟Hash索引的区别

(1)B+tree 支持范围,但是Hash是k-v的形式,所以不支持范围查询

(2)查询性能方面,如果等值查询,hash比tree要快很多,因为它是k-v的hash结构。

8.有没有可能问B+树、B树以及二叉树的区别

9.对 MySQL 性能优化的理解

MySQL 的性能优化我认为可以分为 4 大部分:硬件和操作系统层面的优化、架构设计层面的优化、MySQL 程序配置优化、 SQL 优化

9.1 硬件及操作系统层面优化

(1)从硬件层面来说,影响 Mysql 性能的因素有,CPU、可用内存大小、磁盘读写速度、网络带宽

(2)从操作系层面来说,应用文件句柄数、操作系统网络的配置都会影响到 Mysql性能。

这部分的优化一般由 DBA 或者运维工程师去完成。

9.2 架构设计层面的优化

MySQL 是一个磁盘 IO 访问量非常频繁的关系型数据库,在高并发和高性能的场景中.MySQL 数据库必然会承受巨大的并发压力,而此时,

我们的优化方式可以分为几个部分。

①搭建 Mysql 主从集群,单个 Mysql 服务容易单点故障,一旦服务器宕机,将会导致依赖 Mysql 数据库的应用全部无法响应。 主从集群或者主主集群可以保证服务的高可用性。

②读写分离设计,在读多写少的场景中,通过读写分离的方案,可以避免读写冲突导致的性能影响

③引入分库分表机制,通过分库可以降低单个服务器节点的 IO 压力,通过分表的方式可以降低单表数据量,从而提升 sql 查询的效率。

④针对热点数据,可以引入更为高效的分布式数据库,比如 Redis、MongoDB等,他们可以很好的缓解 Mysql 的访问压力,同时还能提升数据检索性能。

9.3 MySQL 程序配置优化

对于 Mysql 数据库本身的优化,一般是通过 Mysql 中的配置文件 my.cnf 来完成的,比如。

Mysql5.7 版本默认的最大连接数是 151 个,这个值可以在 my.cnf 中修改。

binlog 日志,默认是不开启

缓存池 bufferpoll 的默认大小配置等。

由于这些配置一般都和用户安装的硬件环境以及使用场景有关系,因此这些配置

官方只会提供一个默认值,具体情况还得由使用者来修改。

关于配置项的修改,需要关注两个方面。

l 配置的作用域,分为会话级别和全局

l 是否支持热加载

因此,针对这两个点,我们需要注意的是:

l 全局参数的设定对于已经存在的会话无法生效

l 会话参数的设定随着会话的销毁而失效

l 全局类的统一配置建议配置在默认配置文件中,否则重启服务会导致配置失效

9.4 SQL 优化又能分为三步曲

(1)慢 SQL 的定位和排查

我们可以通过慢查询日志和慢查询日志分析工具得到有问题的 SQL 列表。

(2)执行计划分析

针对慢 SQL,我们可以使用关键字 explain 来查看当前 sql 的执行计划.可以重点

关注 type key rows filterd 等字段 ,从而定位该 SQL 执行慢的根本原因。再有

的放矢的进行优化

(3)使用 show profile 工具

Show Profile 是 MySQL 提供的可以用来分析当前会话中,SQL 语句资源消耗情

况的工具,可用于 SQL 调优的测量。在当前会话中.默认情况下处于 show profile

是关闭状态,打开之后保存最近 15 次的运行结果

针对运行慢的 SQL,通过 profile 工具进行详细分析.可以得到 SQL 执行过程中

所有的资源开销情况. 如 IO 开销,CPU 开销,内存开销等. 以上就是我对 MySQL 性能优化的理解。

常见的 SQL 优化规则:

①SQL 的查询一定要基于索引来进行数据扫描

②避免索引列上使用函数或者运算,这样会导致索引失效

③where 字句中 like %号,尽量放置在右边

④使用索引扫描,联合索引中的列从左往右,命中越多越好.

⑤尽可能使用 SQL 语句用到的索引完成排序,避免使用文件排序的方式

⑥查询有效的列信息即可.少用 * 代替列信息

⑦永远用小结果集驱动大结果集。

MySQL查看SQL语句执行效率的SQL语句

(1)Explain语法:explain select ... from ... where ...

(2)type:这列最重要,显示了连接使用了哪种类别,有无使用索引,是使用Explain命令分析性能瓶颈的关键项之一。

一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。

MySQL中union all和union的区别

(1)如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字。union(或称为联合)的作用是将多个结果合并在一起显示出来。

(2)Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序。Union在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表Union。

(3)Union All:对两个结果集进行并集操作,包括重复行,不进行排序。如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。

相关推荐
CallFay云起未来15 分钟前
AI客服上线后多久才能回本?从TCO到ROI的完整测算方法
java·大数据·人工智能·架构·文心一言
Sam_Deep_Thinking15 分钟前
什么是CountDownLatch?
java·后端·面试·程序员
小蒜学长21 分钟前
基于SpringBoot和Vue的低卡食品销售系统的设计与实现(代码+数据库+LW)
java·后端·springboot·健康管理·低卡食品销售系统
CRMEB系统商城25 分钟前
前后端技术栈全面换代!CRMEB 多商户(Java)v3.0更新预告
java·开发语言·小程序·php
白起那么早25 分钟前
idea 插件-把数据库的表画出来
数据库·后端·intellij idea
fengkai454544 分钟前
十一、MySQL 第 1‑3 章
运维·数据库·mysql
雾喔1 小时前
近日总结 & 面试经验
面试·职场和发展
Lancker1 小时前
记一次 Druid 连接 MySQL 报 Communications link failure 的排查过程
数据库·mysql·adb
Sayai1 小时前
Neo4j 内嵌模式(Embedded)实战:Java 嵌入式 vs 服务端部署的写入性能对比与 GC 调优
java·开发语言·性能优化·neo4j·图数据库
木头科技1 小时前
AI 工程化第四篇】Spring AI Agent 线上可观测实战:Token 成本、调用链、工具耗时、RAG 命中率怎么监控
java·人工智能·spring