【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这三个判断条件语句,正常来说任何情况下,…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
