【MySQL 进阶之路】存储引擎和SQL优化技巧分析
1.InnoDB和MyISAM存储引擎的区别是什么?你在哪些场景下选择InnoDB?
-
Innodb是高并发,支持事务跟行级锁,myisam不支持事务和行级锁,支持表级锁,不支持高并发。innodb底层是B+树,适合范围查询,快速查询的性能都不错,myisam是哈希索引,使用与精确查找。
-
理解:在讨论 InnoDB 和 MyISAM 的区别时,首先要明确两者在事务支持、锁机制以及存储结构上的差异。InnoDB 支持事务、行级锁以及外键约束,这使得它适用于对数据一致性和高并发要求较高的场景。相比之下,MyISAM 使用表级锁,并且不支持事务,这在写入操作较少,查询频繁的环境下更为高效。MyISAM的哈希索引(在某些情况下)与B+树索引并存,这对于快速的查找和检索有所帮助,适合读多写少的应用。选择 InnoDB 时,通常是在需要保证数据一致性、执行复杂查询、以及高并发的场景下。而 MyISAM 更适合读取频繁但数据修改较少的场合。需要注意的是,虽然 MyISAM 在查询性能上有优势,但在数据安全性和恢复方面不如 InnoDB。
2.请描述什么是"死锁",你如何解决死锁问题?
-
死锁就是两个或多个事务互相等待对方释放锁,导致业务停摆。想要解决死锁,1.减少事务持有锁时间 2.设置事务访问顺序,避免事务交叉冲突 3. 设置事务对超时锁进行释放 4.设置合理隔离级别和锁粒度,合理使用行锁表锁。 5. 设置死锁检测和事务回滚机制。
-
理解:在处理 死锁 问题时,死锁通常是由于两个或更多的事务在等待对方释放锁,导致无法继续执行。解决死锁的方法包括减少事务持有锁的时间、按相同顺序访问数据表、以及合理的事务设计。InnoDB 存储引擎内置了死锁检测机制,能自动发现死锁并回滚其中一个事务,这是一种非常有效的应对策略。为了避免死锁,可以通过合理设计事务的粒度,避免嵌套事务,并确保事务访问数据的顺序一致。此外,尽量减少锁的竞争,避免长时间持有锁,是预防死锁的重要手段。
3.你在SQL优化中最常用的技巧有哪些?举例说明。
-
sql优化技巧:我认为sql优化的根本就是避免全表查询,实现覆盖索引。对sql优化,这些事sql优化注意事项,我们可以通过explain查看一条sql执行计划,通过type和extra查看这条sql具体性能,做sql优化就是使其type往ref这边靠。
-
理解:在进行 SQL 优化 时,首先要学会使用
EXPLAIN命令分析查询计划。通过分析EXPLAIN输出中的type、key和extra字段,可以帮助我们识别潜在的性能瓶颈。通常,ALL类型表示全表扫描,index或range表示索引扫描,这些信息能帮助我们判断查询是否需要优化。优化策略包括避免全表扫描、创建合适的索引、使用覆盖索引等。可以通过合适的查询重写来提高查询效率,比如使用JOIN替代IN查询,或者在适当的情况下,使用UNION ALL替代UNION,避免去重操作。除此之外,还可以通过合理选择索引列的顺序,优化查询性能。例如,针对复合索引,首先应该放置在查询中使用最频繁、选择性最高的列。
4.在事务的隔离级别中,"可重复读"和"串行化"的区别是什么?
-
RR保障了事务访问数据库查询数据时,不会出现其他事务干涉当前数据。但是不能避免幻读,会查询到数据这个区间内,其他事务增删改后的数据。而串行化是最高隔离等级,事务和事务之间均不可干涉,并发性能较差,安全系数较高。而幻读是由于一个事务读取数据时,其他事务修改了这个数据结果集内的某些数据后,再次读取的数据就是幻读数据。
-
理解: 事务的隔离级别 对数据库性能的影响也非常重要。可重复读(REPEATABLE READ) 和 串行化(SERIALIZABLE) 是两种常见的事务隔离级别。可重复读确保事务在执行期间读取的记录始终保持一致,避免了不可重复读的现象,但它仍然可能受到幻读的影响。为了避免幻读,InnoDB 在可重复读隔离级别下采用了 Gap Lock 技术,这能够防止在事务执行期间其他事务插入符合条件的记录。相比之下,串行化 隔离级别提供最强的隔离性,它通过强制事务按照顺序执行来避免脏读、不可重复读和幻读。然而,这也会显著降低并发性,因此只应在数据一致性要求极高的场合使用。
5.假设一个查询的执行计划显示一个全表扫描,但你觉得它可以优化。你会采取什么措施?
-
如果通过EXPLAIN显示其type是all,我觉得可以对这个查询字段添加索引,多个字段添加联合索引,避免Select * 这种写法,改成写具体索引字段。避免索引字段进行计算,避免like头部模糊查询导致的索引字段失效。当分组时,要对分组字段和其他查询字段创建联合索引,对多个排序字段创建联合索引并设置对应顺序。尽量避免使用Force Index强制索引,多表连接时需要注意外连接条件字段是否为索引字段,避免全表查询,并且必须是小表驱动大表。
-
理解:在优化查询时,尤其是全表扫描的情况,可以通过多种方式提高查询效率。首先,确保查询条件字段上有合适的索引,尤其是在
WHERE子句和JOIN操作中使用的字段。避免使用SELECT *,这样可以减少不必要的数据传输和内存占用。对于LIKE查询,尤其是带有前缀通配符的情况,可能会导致全表扫描,因此应尽量避免。使用联合索引时,正确的索引顺序也很关键。联合索引的顺序应根据查询条件的使用频率来决定,这样可以提高查询效率。例如,如果查询条件中经常用到A和B,但查询中大部分时间只用到A,那么联合索引应首先包含A,然后是B。此外,尽量避免使用FORCE INDEX,因为它强制数据库使用特定的索引,这在很多情况下会降低查询性能,尤其是当数据库优化器本身已经选择了最佳索引时。
相关文章:
【MySQL 进阶之路】存储引擎和SQL优化技巧分析
1.InnoDB和MyISAM存储引擎的区别是什么?你在哪些场景下选择InnoDB? Innodb是高并发,支持事务跟行级锁,myisam不支持事务和行级锁,支持表级锁,不支持高并发。innodb底层是B树,适合范围查询&#…...
vue+elementUI从B页面回到A页面并且定位到A页面的el-tabs的某个页签
场景 做项目碰到一个需求,不能使用组件缓存keep-alive,但是需要跳转到B页面后,点击B页面的返回回到A页面的某个页签,灵机一动利用路由拦截去判断即将要跳转的页面后,在获取vm里对应的标签变量进行赋值,实现…...
{结对编程/大模型} 实践营项目案例 | 基于RAG搭建政策问答智能聊天助手
在构建政策问答智能聊天助手的过程中,我们采用了 RAG(Retrieval-Augmented Generation)技术。RAG 是一种结合了检索和生成的混合型自然语言处理技术,它通过检索相关信息来增强生成模型的上下文理解能力。RAG 的主要优点在于能够有…...
【Canvas与图标】乡土风金属铝边立方红黄底黑字图像处理图标
【成图】 120*120图标: 大小图: 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>金属铝边立方红黄底黑…...
【开源】A064—基于JAVA的民族婚纱预定系统的设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看项目链接获取⬇️,记得注明来意哦~🌹 赠送计算机毕业设计600个选题ex…...
C++实现一个经典计算器(逆波兰算法)附源码
1、本篇要实现的内容 最近,大家讨论计算器的实现比较热,今天我也来用C和Visual Studio实现一个计算器的小程序。这里使用逆波兰算法,能够根据当前用户输入的算式表达式字符串,计算出所要的结果,算式字符串可以包括加、…...
Python知识分享第二十二天-数据结构入门
数据结构 “”" 基础概念: 程序 数据结构 算法 数据结构 存储和组织数据的方式. 算法 解决问题的思维, 思路, 方式. 算法的特性:独立性: 算法 思维, 是解决问题的思路和方式, 不依赖语言.5大特性: 有输入, 有输出, 有穷性, 确定性, 可行性.问: 如何衡量算法的优劣?…...
【WRF理论第十三期】详细介绍 Registry 的作用、结构和内容
目录 1. Introduction:介绍 Registry 的作用和功能。2. Registry Contents:详细描述 Registry 的结构和内容,包括各个部分的条目类型。2.1. DIMSPEC ENTRIES(维度规格条目)2.2. STATE ENTRIES(状态变量条目…...
Android启动优化指南
文章目录 前言一、启动分类与优化目标1、冷启动1.1 优化思路1.2 延迟初始化与按需加载1.3 并行加载与异步执行1.4 资源优化与懒加载1.5 内存优化与垃圾回收控制 2. 温启动2.1 优化应用的生命周期管理2.2 数据缓存与懒加载2.3 延迟渲染与视图优化 3. 热启动3.1 保持应用的状态3.…...
【ETCD】【源码阅读】configureClientListeners () 函数解析
逐步解析 configureClientListeners 函数 configureClientListeners 是 ETCD 的一个重要函数,用于配置客户端通信的监听器(Client Listeners)。这些监听器主要负责处理外部客户端与 ETCD 服务之间的通信,包括 HTTP 和 gRPC 请求。…...
IO进程学习笔记
man手册 普通命令。系统调用的函数。库函数。特殊文件。文件格式。游戏。附加的一些变量 IO介绍 I:input 输入 O:output 输出 对文件的输入和输出 输入-》写文件,将文件中的内容写到内存中去 输出-》读文件,将内存中的内容读取到文…...
智能手机回暖:华为点火,小米荣耀OV拱火
进入11月中下旬,智能手机圈再度热闹起来。包括华为、小米、OPPO、vivo等诸多手机厂商,都在陆续预热发布新机,其中就包括华为Mate 70、小米Redmi K80、vivo的S20,IQOO Neo10等热门新机,这些热门新机的集中上市迅速吸引了…...
Sqoop导入数据(mysql---->>hive)
目录 数据传输流程脚本报错和异常说明1. Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf2. 数据导入hive后显示NULL 数据传输流程 mysql---->>hdfs---->>hive 数据从mysql表中取出,放到hdfs上(由targ…...
实验3-实时数据流处理-Flink
1.前期准备 (1)Flink基础环境安装 参考文章: 利用docker-compose来搭建flink集群-CSDN博客 显示为这样就成功了 (2)把docker,docker-compose,kafka集群安装配置好 参考文章: …...
深度学习实验十四 循环神经网络(1)——测试简单循环网络的记忆能力
目录 一、数据集构建 1.1数据集的构建函数 1.2加载数据集并划分 1.3 构建Dataset类 二、模型构建 2.1嵌入层 2.2SRN层 2.3模型汇总 三、模型训练 3.1 训练指定长度的数字预测模型 3.2 损失曲线展示 四、模型评价 五、修改 附完整可运行代码 实验大体步骤&#x…...
k8s部署odoo18(kubeshpere面板)
Postgresql部署 链接: kubesphere搭建 postgres15 因为我的是在另一台服务器使用kubesphere进行部署的,如果有和我一样情况的,可以参考上面的文档部署postgreasql。 注意事项: 因为odoo不允许使用postgresql的默认用户,也就是po…...
【模型对比】ChatGPT vs Kimi vs 文心一言那个更好用?数据详细解析,找出最适合你的AI辅助工具!
在这个人工智能迅猛发展的时代,AI聊天助手已经深入我们的工作与生活。你是否曾在选择使用ChatGPT、Kimi或是百度的文心一言时感到一头雾水?每款AI都有其独特的魅力与优势,那么,究竟哪一款AI聊天助手最适合你呢?本文将带…...
Java——容器(单例集合)(上)
一 容器介绍 容器,是用来容纳物体、管理物体。生活中,我们会用到各种各样的容器。如锅碗瓢盆、箱子和包等 程序中的“容器”也有类似的功能,用来容纳和管理数据。比如,如下新闻网站的新闻列表、教育网站的课程列表就是用“容器”来管理 视频…...
如何配置Github并在本地提交代码
前提: 可以流畅访问github, 需要一些上网技巧, 这就自行处理了 申请一个github账号 Github官网地址 首先就是邮箱注册啦, github没有对邮箱的限制, 只要是能收邮件的就ok, qq邮箱, 163等都可以使用. 然后和普通注册账号一样, 一路填写需要的信息, 验证邮箱即可. 如何新增代…...
工作bug,keil5编译器,理解int 类型函数返回值问题,详解!!!
编写不易,禁止搬运,仅供学习,感谢理解 问题现象 下面是一个在keil5里面写的一个,int类型的返回值函数,这个函数里面,只有if else if else这三个判断条件语句,正常来说任何情况下,…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
