Java面试必问题29:MySQL篇(重点必问)

  1. 数据库的ACID特性
  1. 原子性(Atomicity):事务中的操作要么全部成功,要么全部失败。事务是一个不可分割的单元,要么全部执行,要么全部回滚。如果事务中的任何操作失败,所有操作都将被回滚到事务开始之前的状态,以保证数据的一致性。
  2. 一致性(Consistency):事务的执行应使数据库从一个一致性状态转移到另一个一致性状态。在事务开始和结束时,数据库的完整性约束应得到满足,确保数据的正确性和一致性。
  3. 隔离性(Isolation):每个事务在执行过程中都应该与其他事务隔离。并发事务的执行应当互不干扰,每个事务应该感知不到其他事务的存在或并发执行。隔离级别定义了不同事务之间的可见性和互相影响的程度。
  4. 持久性(Durability):一旦事务提交成功,其对数据库的修改应该永久保存,即使系统发生故障或重启,也应该能够保持数据的持久性。

最简回答:ACID特性是指原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),用于保证数据库事务的可靠性和一致性。

  1. MySQL存储引擎

MySQL默认是Innodb存储引擎,适合比较庞大的应用场景

  1. InnoDB:MySql 5.6 版本默认的存储引擎。InnoDB 是一个事务安全的存储引擎,它具备提交、回滚以及崩溃恢复的功能以保护用户数据。InnoDB 的行级别锁定以及 Oracle 风格的一致性无锁读提升了它的多用户并发数以及性能。InnoDB 将用户数据存储在聚集索引中以减少基于主键的普通查询所带来的 I/O 开销。为了保证数据的完整性,InnoDB 还支持外键约束。
  2. MyISAM:MyISAM既不支持事务、也不支持外键、其优势是访问速度快,但是表级别的锁定限制了它在读写负载方面的性能,因此它经常应用于只读或者以读为主的数据场景。

最简回答:InnoDB是MySQL的默认存储引擎,支持事务处理、行级锁和外键;而MyISAM不支持事务、只有表级锁,并且不支持外键。

  1. 数据库的事务隔离级别

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

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

隔离级别

脏读

不可重复读

幻读

READ-UNCOMMITTED

READ-COMMITTED

×

REPEATABLE-READ

×

×

SERIALIZABLE

×

×

×

事务隔离级别越严格,数据库效率越低。MySQL默认的事务隔离级别是:REPEATABLE-READ可重复读级别,简称RR级别,会出现幻读问题。

最简回答:数据库事务隔离级别是指在多个并发事务同时执行时,各个事务之间的隔离程度,常见的隔离级别有读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。

  1. 索引会失效的情况有哪些

下面列举几种不走索引的 SQL 语句:

  1. 索引列参与表达式计算:
  1. SELECT 'sname' FROM 'stu' WHERE 'age' + 10 = 30;
  1. 函数运算:
  1. SELECT 'sname' FROM 'stu' WHERE LEFT('date',4) < 1990;
  1. %词语%–模糊查询:
  1. SELECT * FROM 'manong' WHERE `uname` LIKE '码农%' -- 走索引
  2. SELECT * FROM 'manong' WHERE `uname` LIKE '%码农%' -- 不走索引

  1. 字符串与数字比较不走索引:
  1. CREATE TABLE 'a' ('a' char(10));
  2. EXPLAIN SELECT * FROM 'a' WHERE 'a'="1" — 走索引
  3. EXPLAIN SELECT * FROM 'a'WHERE 'a'=1 — 不走索引,同样也是使用了函数运算
  1. 查询条件中有 or ,即使其中有条件带索引也不会使用。换言之,就是要求使用的所有字段,都必须建立索引:
  1. select * from dept where dname='xxx' or loc='xx' or deptno = 45;
  1. 正则表达式不使用索引。

  1. MySQL索引底层原理

MySQL的索引底层结构是B+树。

B+树是一种平衡多路搜索树,具有以下特点:

1. 所有关键字保存在叶子节点,并且叶子节点之间通过链表连接,形成一个有序的叶子节点序列。

2. 非叶子节点只存储索引字段的值和子节点的指针,不保存实际的数据。这样可以使得一个节点可以存储更多的关键字,减少了树的高度,加快搜索速度。

3. 叶子节点包含所有索引字段的值和指向对应数据的指针。

在B+树索引中,每个节点的大小是固定的,与磁盘页的大小相当。节点的大小通常是数据库页的大小,例如16KB或32KB。每个节点可以存储多个关键字和指针。叶子节点的关键字是有序的,且通过链表连接在一起。

索引查询快的原因有以下几点:

1. 路径长度短:B+树具有平衡性,所有叶子节点的深度相同,因此在查询过程中只需要沿着树的高度进行几次磁盘I/O操作,所以查询速度较快。

2. 顺序访问优势:B+树的叶子节点之间使用链表连接,并且叶子节点的关键字是有序的,因此对于范围查询操作,可以通过顺序扫描叶子节点来获取有序的数据结果,提高查询速度。

3. 最小化磁盘I/O操作:B+树具有较高的填充因子,每个磁盘页上存储的关键字数量较多,能够减少磁盘I/O操作的次数,提高查询效率。

综上所述,B+树的平衡性、有序的叶子节点、顺序访问以及最小化的磁盘I/O操作是使得索引查询快速的关键因素。通过B+树的数据结构和索引的建立,可以大幅度减少磁盘访问次数,提高数据库查询的效率。

最简回答:MySQL索引底层原理使用了B+树数据结构,它是一种平衡树,能快速定位和检索数据;B+树的叶子节点存储实际数据,中间节点存储索引,通过减少磁盘IO来提高查询效率;索引按照值的大小顺序排列,使得范围查询效率更高。

  1. MySQL优化方案
    • 服务器优化(增加CPU、内存、网络、更换高性能磁盘)
    • 表设计优化(字段长度控制、添加必要的索引)
    • SQL优化(避免SQL命中不到索引的情况)
    • 架构部署优化(一主多从集群部署)
    • 编码优化实现读写分离

  1. SQL优化方案

1. 优化查询条件

   使用索引:确保所有涉及到的列都有适当的索引。

  1.    SELECT * FROM table WHERE column = 'value';
  2.    CREATE INDEX idx_column ON table(column);

   避免模糊查询:%开头的通配符会使索引失效,尽量避免在查询条件中使用以%开头的LIKE语句。

  1. SELECT * FROM table WHERE column LIKE 'value%';

2. 使用合适的数据类型

   使用最小可能的数据类型:选择最合适的数据类型,不要使用比实际需要更大的数据类型。

  1.   CREATE TABLE example (column1 INT, column2 VARCHAR(50));

   避免使用存储过大的数据类型:避免使用TEXT、BLOB等存储过大的数据类型,因为它们会占用更多的存储空间和I/O操作。

3. 减少查询次数

   使用JOIN查询:通过优化JOIN语句,避免使用多个单表查询。

  1. SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

  使用批量操作:合并多个相似的操作为一个更大的操作,减少多次查询和事务提交。

  1. INSERT INTO table (column1, column2) VALUES (value1, value2), (value3, value4), ...;

4. 优化索引

 检查索引使用情况:通过EXPLAIN或其他性能分析工具,检查查询是否使用了适当的索引。

  1.    EXPLAIN SELECT * FROM table WHERE column = 'value';

   - 删除不必要的索引:移除未使用或被其他索引覆盖的冗余索引,减少索引维护的开销。

5. 避免使用SELECT *

 明确列出所需的列:只选择需要的列,避免不必要的数据传输和处理。

  1. SELECT column1, column2 FROM table;

  1. 如何设计数据库表
  1. 数据库设计规范
    • 根据业务模块拆分数据库(业务模块垂直分库)
    • 同一业务模块的表在一个数据库里
  2. 表设计规范
    • 表名、字段名全部小写英文带下划线
    • 字段类型长度根据实际需求选择
    • 设计基础字段(主外键ID、时间、逻辑删除、版本)
    • 添加必要冗余字段
    • 添加必要索引(常用于查询的单字段或组合索引),单表索引建议控制在5个以内
    • 规划分表(单表超500万行或容量超2G才分表)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

​5种常用于LLM的令牌遮蔽技术介绍以及Pytorch的实现

本文将介绍大语言模型中使用的不同令牌遮蔽技术&#xff0c;并比较它们的优点&#xff0c;以及使用Pytorch实现以了解它们的底层工作原理。 令牌掩码Token Masking是一种广泛应用于语言模型分类变体和生成模型训练的策略。BERT语言模型首先使用&#xff0c;并被用于许多变体(R…

python|enumerate

enumerate可以用来列举可遍历的对象 # 假设我们有一个列表 fruits [apple, banana, cherry] # 使用enumerate()函数遍历列表 for index, fruit in enumerate(fruits): print(f"Index: {index}, Fruit: {fruit}")# 假设我们想要从1开始计数 for index, fru…

使用ADO.NET访问数据库

目录 访问数据库的步骤 &#xff11;、建立数据库 &#xff12;、设置链接参数 &#xff08;1&#xff09;web网页和数据库连接的方法一 &#xff08;2&#xff09;web网页和数据库连接的方法二 &#xff13;、建立链接对象 &#xff14;、显示数据库 &#xff15;、数…

第十五讲:C语言内存函数

目录 1、C语言内存函数 1.1、memcpy函数的使用和模拟 1.2、memmove函数的使用和模拟 1.3、memset函数的使用 1.4、memcmp函数的使用 1、C语言内存函数 注意&#xff1a;下面这些函数的使用要包含头文件&#xff1a;string.h 1.1、memcpy函数的使用和模拟 函数声明为&am…

echarts 条形图(柱状图)多个图例按钮默认高亮一个,且只能高亮一个

核心&#xff1a;给图例按钮添加点击事件 myChart.on("legendselectchanged", function (params) {let selected {功率柜: true,母线柜: false,充电桩终端: false,网络柜: false,};for (let key in selected) {if (key ! params.name) {myChart.setOption({legend:…

vue3使用jsQR解析二维码

1.了解jsQR jsQR是一个纯javascript脚本实现的二维码识别库,不仅可以在浏览器端使用,而且支持后端node.js环境。jsQR使用较为简单,有着不错的识别率。 2.效果图 3.二维码 4.下载jsqr包 npm i -d jsqr5.代码 <script setup> import {ref } from vue import jsQR fr…

视频图像的两种表示方式YUV与RGB(1)

了解过计算机图形图像学的该知道&#xff0c;可用RGB和YUV两种方式表示图像像素&#xff0c;视频由一帧一帧的图像组成&#xff0c;每一张图片是一个一个的像素点组成&#xff0c;既然有两种表示像素的方法&#xff0c;那就一起解一下两种表示方式的异同及优缺点。 RGB像素 这…

【PPT技巧】如何取消PPT的密码保护?

PPT文件有两种密码&#xff0c;一种是打开密码、一种是修改权限。今天分享这两种密码如何取消。 首先需要告知大家的是&#xff0c;密码的取消需要输入正确的密码。 打开密码的取消&#xff0c;我们需要先输入密码&#xff0c;打开文件&#xff0c;然后点击文件 – 信息 – 保…

os.listdir()bug总结

今天测试出一个神奇的bug&#xff0c;算是教训吧&#xff0c;找了两天不知道问题在哪&#xff0c;最后才发现问题出现在这 原始文件夹显示 os.listdir()结果乱序 import os base_path "./file/"files os.listdir(base_path)print(files)问题原因 解决办法(排序) …

YOLOv8全网独家改进: 小目标 |新颖的多尺度前馈网络(MSFN) | 2024年4月最新成果

💡💡💡本文独家改进:多尺度前馈网络(MSFN),通过提取不同尺度的特征来增强特征提取能力,2024年最新的改进思路 💡💡💡创新点:多尺度前馈网络创新十足,抢先使用 💡💡💡如何跟YOLOv8结合:1)放在backbone后增强对全局和局部特征的提取能力;2)放在detect…

解密项目管理专业术语:十大名词背后的实战技巧

项目管理是一门综合学科&#xff0c;涵盖了一系列方法、技能和工具。今天为大家带来项目管理的十大专业术语&#xff0c;它们分别是项目范围、利益相关者管理、工作分解结构&#xff08;WBS&#xff09;、里程碑、风险管理、资源分配、关键路径法&#xff08;CPM&#xff09;、…

漏洞挖掘 | 从信息收集到登录后台

通过信息收集进网站后台 记录一次通过简单的信息收集获取账号信息后进入后台的经过。打开思路&#xff0c;利用我们所有能够捕获的信息并串联起来。 0X0 开始&#xff1a; 打开网站发现是一个登录网站 随便输入账号密码&#xff0c;发现有用户名枚举&#xff1a; 0X1 获取ic…

SuperMap GIS基础产品FAQ集锦(202403)

一、SuperMap GIS基础产品桌面GIS-FAQ集锦 问题1&#xff1a;【iDesktop】安装了idesktop 11i&#xff0c;现想进行插件开发&#xff0c;根据安装指南安装SuperMap.Tools.RegisterTemplate.exe&#xff0c;运行多次均失败 【问题原因】该脚本是之前老版本针对VS2010写的&…

蓝桥杯-外卖店优先级

代码及其解析 #include<bits/stdc.h> using namespace std; const int N100010;int order[N]; //order[id] 第id号店上一次的订单,记录的是时间 int prior[N]; //prior[id] 第id号店的优先级 int flag[N]; //flag[id] 第id号店在不在优先缓存中struct node{int…

【RHEL】redhat yum 报错: not registered to Red Hat Subscription Management.

【RHEL】redhat yum 报错: not registered to Red Hat Subscription Management. 问题描述解决方法参考博客&#xff1a; 问题描述 使用redhat7用yum install -y dos2unix命令时出现这个错误 This system is not registered to Red Hat Subscription Management. You can use …

CAXA电子图版2020版 下载地址及安装教程

CAXA电子图板是一款由国内软件公司CAXA开发的专业CAD&#xff08;计算机辅助设计&#xff09;软件。它主要用于绘制和编辑各种类型的二维图纸和工程图纸&#xff0c;广泛应用于建筑、机械、电气和电子等行业。 CAXA电子图板具有以下主要功能和特点&#xff1a; 二维绘图&…

seo调优

SEO 网站地图&#xff1a;sitemap.xmlrobots.txtxxx.com/www.xxx.com 解析到服务器&#xff0c;xxx.com 301 到 www.xxx.comhttps百度站点管理标题描述关键词标签语义化内链外链死链链接html结尾友情链接前端架构 注意&#xff1a;已收录链接&#xff0c;禁止改变链接地址 ro…

C语言——文件管理

文件&#xff1a;即磁盘上的文件&#xff0c;使用文件可以将数据直接存放在电脑的硬盘上&#xff0c;做到数据持久化。 在程序设计中&#xff0c;按文件的功能划分&#xff0c;将文件分为程序文件与数据文件 程序文件 程序文件包括源文件&#xff08;.c&#xff09;&#xff0…

Ubuntu20.04连接不了无线网

1.首先查看网卡型号 lspci Network controller显示的就是网卡型号 也可以使用如下命令 lspci -nnk | grep 0280 -A3 2.找到对应的驱动并下载安装 我的电脑的网卡型号为Realtek Semiconductor Co., Ltd. Device b852&#xff0c;则采用如下命令安装&#xff1a; sudo ap…

vue3+Ts+Ant Design Vue +天地图组件封装

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vue3TsAntDesign-Vue组件天地图组件的封装 示例图 首先,在index.html引入天地图资源,vue3选择v4版本 <script src"http://api.tianditu.gov.cn/api?…