java面试之MySQL数据库篇

文章目录

  • 1.SQL分类
  • 2.关系型数据库和非关系型数据库的区别
  • 2.并发事务带来的问题(脏读、不可重复读以及幻读),怎么解决?
  • 6.什么是索引?
  • 7.B+tree索引跟Hash索引的区别
  • 8.有没有可能问B+树、B树以及二叉树的区别
  • 9.对 MySQL 性能优化的理解
    • 9.1 硬件及操作系统层面优化
    • 9.2 架构设计层面的优化
    • 9.3 MySQL 程序配置优化
    • 9.4 SQL 优化又能分为三步曲
  • MySQL查看SQL语句执行效率的SQL语句
  • MySQL中union all和union的区别

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:对两个结果集进行并集操作,包括重复行,不进行排序。如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/5857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PHP】安装指定版本Composer

1、下载指定版本composer.phar文件:https://github.com/composer/composer/releases 2、将下载的文件添加到全局路径: sudo mv composer.phar /usr/local/bin/composer 3、赋予权限: sudo chmod x /usr/local/bin/composer 4、查看compos…

Linux进程——进程的创建(fork的原理)

前言:在上一篇文章中,我们已经会使用getpid/getppid函数来查看pid和ppid,本篇文章会介绍第二种查看进程的方法,以及如何创建子进程! 本篇主要内容: 查看进程的第二种方法创建子进程系统调用函数fork 在开始前&#xff…

一文了解双向链表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、链表分类二、双向链表是什么?三、功能函数实现1.申请一个节点2.初始化3.尾插4.头插5.尾删6.头删7.在指定位置后插入8.删除指定位置数据9.查找10…

带环链表问题

带环链表就是字面意思带环的链表,例如以下这三种情况 练习题 1.给定一个链表,判断链表中是否带环. - 力扣(LeetCode) 思路:快慢指针,慢指针走一步,快指针走两步,两个指针从链表的起…

【项目经验】Redis Sentinel从工程中下线并对业务迁移-(二)

在上篇文章【项目经验】Redis Sentinel从工程中下线并对业务迁移-进行中-CSDN博客有说到迁移的计划。最近一直按照计划进行迁移,期间遇到了不少问题。总结如下: 一、key未设置过期时间 redis基于内存存储,主要作用是缓存。当大量的key未设置…

nginx的前世今生(二)

书接上回: 上回书说到,nginx的前世今生,这回我们继续说 3.缓冲秘籍,洪流控水 Nginx的缓冲区是其处理数据传输和提高性能的关键设计之一,主要用于暂存和管理进出的数据流,以应对不同组件间速度不匹配的问题…

池化整合多元数据库,zData X 一体机助力证券公司IT基础架构革新

引言 近期,云和恩墨 zData X 多元数据库一体机(以下简称 zData X)在某证券公司的OA、短信和CRM业务系统中成功上线,标志着其IT基础架构完成从集中式存储向池化高性能分布式存储的转变。zData X 成功整合了该证券公司使用的达梦、O…

Windows php 安装 Memcached扩展、php缺失 Memcached扩展、Class ‘Memcached‘ not found

在Windows系统下如何安装 php Memcached 扩展 下载dll文件 pecl地址:https://pecl.php.net/package/memcached 根据版本进行选择 : 解压下载的文件后得到了这么样的文件结构: 配置 移动dll文件到相应文件位置 重点: libme…

FreeRTOS队列集(1-15)

队列集定义:def 队列集只允许任务间传递消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,就可以使用队列集。 用于对多个信号量进行监听,其中不管哪一个消息到来,都可以让任务退出阻塞状态 假设&am…

如何利用MCU自动测量单元提高大坝安全监测效率

大坝作为重要的水利基础设施,其安全性直接关系到人民群众的生命财产安全和社会的稳定发展。因此,对大坝进行实时、准确的安全监测至关重要。近年来,随着微控制器单元(MCU)技术的不断发展,其在大坝安全监测领域的应用也越来越广泛。…

springboot配置WebMvcConfigurationSupport

一、在spring里有四个mvc配置类 1、mvc配置类 WebMvcConfigurer WebMvcConfigurerAdapter WebMvcConfigurationSupport WebMvcAutoConfiguration 2、WebMvcConfigurer为接口 3、WebMvcConfigurerAdapter是WebMvcConfigurer的实现类,且大部分为空方法,…

微服务架构面试题(二)

1. 请简述微服务中各组件的作用 ? 微服务架构中的组件各自扮演着关键的角色,它们协同工作以构建高效、可扩展和灵活的系统。以下是一些核心组件及其作用: 服务注册与发现组件:如Eureka,负责让其他服务知道当前服务的…

使用 Flask、Gunicorn 与 Shell 脚本构建高效 Web 应用部署流程

在使用 Flask 作为 Web 应用框架,并使用 Gunicorn 作为 WSGI 容器,使用shell 脚本来管理应用的启动、重启和停止。 启动脚本 start.sh: #!/bin/bash# 设置应用名称和端口 APP_NAME"my_flask_app" PORT8000# 设置 Flask 应用的路径…

【PCL】教程 supervoxel_clustering执行超体聚类并可视化点云数据及其聚类结果

[done, 417.125 ms : 307200 points] Available dimensions: x y z rgba 源点云milk_cartoon_all_small_clorox.pcd > Loading point cloud... > Extracting supervoxels! Found 423 supervoxels > Getting supervoxel adjacency 这段代码主要是使用PCL(Po…

【Linux】创建/扩容swap交换空间swap优化

一、当前交换空间大小 目前交换空间大小为2G 二、创建swap交换空间 #创建大小为2G的交换空间 [roothadoop01 data1]# dd if/dev/zero of/data1/swapfile bs1M count2048 #将文件设置为交换空间 [roothadoop01 data1]# mkswap /data1/swapfile #启用交换空间 [roothadoop01 da…

【Python】pandas.cut()函数的用法

pandas.cut() 函数是一个非常有用的工具,用于将数值型数据按照指定的分箱或区间进行分割,从而将连续的数值变量转换为离散的类别变量。这在数据分析和机器学习的特征工程中尤其有用,因为它可以帮助揭示不同区间内的数据分布特征,或…

【Qt问题】Qt Creator 如何链接第三方库

往期回顾 【QT问题】 Qt信号函数如果重名,调用怎么处理-CSDN博客 【Qt问题】Qt中文乱码问题解决方案(详细汇总)-CSDN博客 【Qt问题】Qt常用快捷键汇总-CSDN博客 【Qt问题】Qt Creator 如何链接第三方库 一、为什么会使用第三方库 在编写代码…

Java Web 开发 - 掌握拦截器和监听器

目录 深入了解Java Web的拦截器和监听器 拦截器(Interceptor) 拦截器的使用场景 拦截器实例 思维导图 ​编辑 监听器(Listener) 监听器的使用场景 监听器类型 监听器实例 思维导图​编辑 总结 深入了解Java Web的拦截器…

在UI界面中播放视频_unity基础开发教程

在UI界面中播放视频_unity基础开发教程 前言操作步骤结语 前言 之前我写过一篇在场景中播放视频的文章,但是在开发中有时候也会在UI的界面中播放视频,这期我们做一下在UI的界面中播放视频。 操作步骤 首先在场景中创建一个Raw Image,UI->…

DAO是什么?有什么用途?

DAO(Decentralized Autonomous Organization,去中心化自治组织)是一种基于区块链技术的组织形式,它没有中央管理层,而是通过智能合约和区块链上的代码来运作。DAO 的决策过程是透明的,通常由组织的成员通过…