数据库(总结自小林coding)|索引失效的场景、慢查询、原因及如何优化?undo log、redo log、binlog 作用、MySQL和Redis的区别
数据库(总结自小林coding)|索引失效的场景、慢查询、原因及如何优化?undo log、redo log、binlog 作用、MySQL和Redis的区别
- 说一下索引失效的场景?
- 什么是慢查询?原因是什么?可以怎么优化?
- undo log、redo log、binlog 有什么用
- MySQL和Redis的区别是什么
说一下索引失效的场景?
索引失效意味着查询操作不能利用索引进行数据检索,而是使用全表扫描,从而导致性能下降,下面一些场景会发生索引失效
-
对索引使用左或者左右模糊匹配
-
因为索引 B+ 树是按照索引值 有序排列存储的,只能根据前缀进行比较。
-
如果使用 name like ‘%林’ 方式来查询,因为查询的结果可能是「陈林、张林、周林」等之类的,所以不知道从哪个索引值开始比较,于是就只能通过全表扫描的方式来查询
-
-
对索引使用函数
- 因为索引 保存的是索引字段的原始值,而不是经过函数计算后的值,自然就没办法走索引了
- 不过,从 MySQL 8.0 开始,索引特性增加了 函数索引,也就是可以针对 函数计算后的值建立一个索引,该索引的值是函数计算后的值,所以 就可以通过扫描索引来查询数据
-
对索引进行表达式计算
- 因为索引保存的是索引字段的原始值,而不是 id + 1 表达式计算后的值,所以无法走索引
-
对索引隐式类型转换
- 对索引的隐式类型转换或者叫自动类型转换,效果和对索引使用函数类似,而这样会导致索引失效
- 比如索引原来是字符串类型,而我们输入一个整形,这样的后果就是 索引会执行自动类型转换,也就是等效于对索引使用函数,使索引失效。如果索引使整形,而输入字符串,只会对输入的字符串进行自动类型转换,对索引本身不会任何改变,所有这样不会导致索引失效
-
联合索引不满足最左匹配
- 对 主键字段 建立的索引叫 聚簇索引,对 普通字段 建立的索引叫 二级索引。那么 多个普通字段 组合在一起创建的索引就叫做 联合索引
- 最左匹配原则,也就是按照 最左优先的方式进行索引的匹配。比如创建了一个
(a, b, c)联合索引,在where条件中必须要带有 a字段的值 - 在联合索引的情况下,数据是按照索引第一列排序,第一列数据相同时才会按照第二列排序
-
WHERE 子句中的 OR
- 在 WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列只是普通列,而不是索引列,那么索引会失效
- 因为 OR 的含义就是 两个只要满足一个即可,因此 只有一个条件列是索引列是没有意义的,只要有条件列不是索引列,就会进行全表扫描
什么是慢查询?原因是什么?可以怎么优化?
数据库查询的执行时间超过指定的超时时间时,就被称为 慢查询。
原因:
- 查询语句比较复杂:查询涉及多个表,包含复杂的连接和子查询,可能导致执行时间较长。
- 查询数据量大:当查询的数据量庞大时,即使查询本身并不复杂,也可能导致较长的执行时间。
- 缺少索引或索引失效:如果查询的表没有合适的索引,需要遍历整张表才能找到结果,查询速度较慢。
- 数据库表设计不合理:数据库表设计庞大,查询时可能需要较多时间。
- 并发冲突:当多个查询同时访问相同的资源时,可能发生并发冲突,导致查询变慢。
- 硬件资源不足:如果MySQL服务器上同时运行了太多的查询,会导致服务器负载过高,从而导致查询变慢
优化:
- 分析查询语句:
- 使用 EXPLAIN命令分析 SQL执行计划,找出慢查询的原因,比如是否使用了全表扫描,是否存在索引未被利用的情况等,并根据相应情况对索引进行适当修改。
- 查询优化:
- **避免使用SELECT ***,只查询真正需要的列;
- 使用 覆盖索引,即索引包含所有查询的字段;
- 联表查询最好要以小表驱动大表,并且被驱动表的字段要有索引。最好通过冗余字段的设计,避免 联表查询。
- 创建或优化索引:
- 根据 不同查询条件创建合适的索引,特别是经常用于 WHERE子句的字段、orderby 排序的字段、Join 连表查询的字典、 group by的字段
- 如果查询中经常涉及多个字段,考虑创建 联合索引,使用联合索引要符合最左匹配原则,不然会索引失效
- 不要用左模糊匹配、函数计算、表达式计算等等,防止索引失效
- 分页优化:
- 针对 limit n,y 深分页的查询优化,可以把Limit查询转换成某个位置的查询:select * from tb_sku where id>20000 limit 10,该方案适用于主键自增的表
- 优化数据库表:
- 如果单表的数据超过了千万级别,最好将大表拆分为小表,减轻单个表的查询压力。
- 也可以将字段多的表 分解成多个表,有些字段使用频率高,有些低,数据量大时,使用频率低的字段会导致 变慢,可以考虑将两者分开
- 使用缓存技术:
- 引入缓存层,如Redis,存储热点数据和频繁查询的结果,但是要考虑缓存一致性的问题,对于读请求会选择旁路缓存策略,对于写请求会选择先更新 db,再删除缓存的策略
undo log、redo log、binlog 有什么用
undo log:- 实现事务回滚,保障事务的原子性。事务处理过程中,如果出现了错误或者用户执 行了 ROLLBACK 语句,MySQL 可以利用 undo log 中的历史数据将数据恢复到事务开始之前的状态。
- 实现 **MVCC(多版本并发控制)**关键因素之一。MVCC 是通过 ReadView + undo log 实现的。undo log 为每条记录保存多份历史数据,MySQL 在执行select 语句的时候,会根据事务的 Read View 里的信息,顺着 undo log 的版本链找到满足其可见性的记录。
redo log:- redo log 是 物理日志,记录了某个数据页做了什么修改,比如对 XXX 表空间中的 YYY 数据页 ZZZ 偏移量的地方做了AAA 更新,每当执行一个事务就会产生这样的一条或者多条 物理日志
- 相比于undo log,redo log 记录了此次事务**「修改后」的数据状态,记录的是更新之后的值**,主要用于事务崩溃恢复,保证事务的持久性
- 将 写入磁盘的操作 从**「随机写」变成了「顺序写」**,提升 MySQL 写入磁盘的性能。这是因为 MySQL 的写操作并不是立刻更新到磁盘上,而是先记录在日志上,然后在合适的时间再更新到磁盘上
binlog:- 与刚才两个日志不同,它是
Server层生成的日志,记录了所有 数据库表结构 变更和 表数据 修改的日志,不会记录查询类的操作,比如 SELECT 和 SHOW 操作,主要用于数据备份和主从复制
- 与刚才两个日志不同,它是
MySQL和Redis的区别是什么
- mysql是关系型数据库,使用 表 来组织数据。主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢;而redis是非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限
- MySQL 基于磁盘,读写速度没有Redis快,但是不受空间容量限制,性价比高;Redis基于内存,读写速度快,也可做持久化,但是内存空间有限,当数据量超过内存空间时,需扩充内存,而内存成本较高;
- Redis不使用SQL,而是使用自己的命令集,MySQL使用SQL来进行数据查询和操作。
- Redis以 高性能和低延迟为目标,适用于读多写少的应用场景,适合处理高速、高并发的数据访问,以及需要复杂数据结构和功能的场景,而MySQL 适用于需要支持 复杂查询、事务处理、拥有大规模数据集 的场景。在实际应用中,很多系统会同时使用 MySQL 和 Redis
相关文章:
数据库(总结自小林coding)|索引失效的场景、慢查询、原因及如何优化?undo log、redo log、binlog 作用、MySQL和Redis的区别
数据库(总结自小林coding)|索引失效的场景、慢查询、原因及如何优化?undo log、redo log、binlog 作用、MySQL和Redis的区别 说一下索引失效的场景?什么是慢查询?原因是什么?可以怎么优化?undo …...
Docker容器运行CentOS镜像,执行yum命令提示“Failed to set locale, defaulting to C.UTF-8”
最近对运维比较感兴趣,以前虽然对公司负责的项目做过运维工作,但用的都是最原始的方法,例如是在阿里云服务器上直接安装jdk,tomcat,redis ,nginx 。这种方式对不大的项目还能够支持,随着项目变大,服务增加&…...
OpenCV基本图像处理操作(六)——直方图与模版匹配
直方图 cv2.calcHist(images,channels,mask,histSize,ranges) images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]channels: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的…...
【LLM学习笔记】第四篇:模型压缩方法——量化、剪枝、蒸馏、分解
文章目录 1. 为什么要进行模型压缩2. 模型量化2.1 常见数据类型2.2 浮点数表示2.3 线性量化2.4 非线性量化2.5 挑战2.6 实际应用 3. 模型剪枝4. 模型蒸馏4.1 模型蒸馏的基本流程4.2 模型蒸馏的优势4.3 实际应用 5. 低秩分解(低秩近似)5.1 基本概念5.2 实…...
python3 自动更新的缓存类
这个类会在后台自动更新缓存数据,你只需要调用方法来获取数据即可。 自动更新缓存类 以下是 AutoUpdatingCache 类的实现: import threading import timeclass AutoUpdatingCache:def __init__(self, update_function, expiry_time60):""&qu…...
英语知识网站开发:Spring Boot框架应用
3系统分析 3.1可行性分析 通过对本英语知识应用网站实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本英语知识应用网站采用SSM框架,JAVA作为开发语…...
文件上传upload-labs-docker通关
(图片加载不出,说明被和谐了) 项目一: sqlsec/ggctf-upload - Docker Image | Docker Hub 学习过程中,可以对照源码进行白盒分析. 补充:环境搭建在Linux虚拟机上的同时,以另一台Windows虚拟机进行测试最…...
git(Linux)
1.git 三板斧 基本准备工作: 把远端仓库拉拉取到本地了 .git --> 本地仓库 git在提交的时候,只会提交变化的部分 就可以在当前目录下新增代码了 test.c 并没有被仓库管理起来 怎么添加? 1.1 git add test.c 也不算完全添加到仓库里面&…...
Doris实战—构建日志存储与分析平台
构建日志存储与分析平台 日志是系统运行的详细记录,包含各种事件发生的主体、时间、位置、内容等关键信息。出于运维可观测、网络安全监控及业务分析等多重需求,企业通常需要将分散的日志采集起来,进行集中存储、查询和分析,以进一步从日志数据里挖掘出有价值的内容。 针…...
【vue3+Typescript】unapp+stompsj模式下替代plus-websocket的封装模块
由于plus-websocket实测存在消息丢失的问题,只能寻找替代的方案,看文章说使用原生的即可很好的工作。而目前在stompjs里需要使用websocket类型的封装模块,看了下原来提供的接口,采用uniapp原生的websocket模式,对原模块…...
Tcon技术和Tconless技术介绍
文章目录 TCON技术(传统时序控制器)定义:主要功能:优点:缺点: TCONless技术(无独立时序控制器)定义:工作原理:优点:缺点: TCON与TCONl…...
C#-利用反射自动绑定请求标志类和具体执行命令类
文章速览 概述例程请求类命名空间父类示例子类示例 命令类命名空间子类示例 记录的数据结构实现绑定方法 坚持记录实属不易,希望友善多金的码友能够随手点一个赞。 共同创建氛围更加良好的开发者社区! 谢谢~ 概述 需求: 将指定的两种类型的…...
高中数学练习:初探均值换元法
文章目录 1. 均值换元法定义2. 均值换元法优点3. 均值换元法应用4. 均值换元法示例4.1 求解分式方程4.2 求解指数方程4.3 计算最大值 5. 实战小结 1. 均值换元法定义 均值换元法是一种数学技巧,通过引入新变量 t t t将两个变量 x x x和 y y y表示为它们的平均值加上…...
数据结构单链表,顺序表,广义表,多重链表,堆栈的学习
单链表 比如一个多项式,主要包括x的系数,x的指数,那么可以创建一个一维数组来存储它的系数和指数,用数组下标来表示。它的系数可以用数组下标对应的数组元素来储存。 可是这样储存会浪费空间所以采用单链表形式来存储。 即创建一…...
【保姆级教程】使用lora微调LLM并在truthfulQA数据集评估(Part 2.在truthfulQA上评估LLM)
上一期我们成功用lora微调了一个模型传送门,怎样评估模型呢?目前LLM没有一个统一的BENCHMARK。我们今天选用truthfulQA。 truthfulQA数据集格式如下所示 {question: What is the smallest country in the world that is at least one square mile in ar…...
thinkphp中对请求封装
请求的封装 //调用 $res Http::post($this->baseUrl . $url,$params,[CURLOPT_HTTPHEADER > [Content-Type: application/json,Content-Length: . strlen($params),],]);<?php namespace fast; /*** 字符串类*/ class Http {/*** 发送一个POST请求*/public static …...
leetcode hot100【LeetCode 215.数组中的第K个最大元素】java实现
LeetCode 215.数组中的第K个最大元素 题目描述 给定一个整数数组 nums 和一个整数 k,请返回数组中第 k 个最大的元素。 请注意,要求排名是从大到小的,因此第 k 个最大元素是排序后的第 k 个元素。你需要设计一个高效的算法来解决这个问题。…...
簡單易懂:如何在Windows系統中修改IP地址?
無論是為了連接到一個新的網路,還是為了解決網路連接問題,修改IP地址都是一個常見的操作。本文將詳細介紹如何在Windows系統中修改IP地址,包括靜態IP地址的設置和動態IP地址的獲取。 IP地址是什麼? IP地址是互聯網協議地址的簡稱…...
Python中的23种设计模式:详细分类与总结
设计模式是解决特定问题的通用方法,分为创建型模式、结构型模式和行为型模式三大类。以下是对每种模式的详细介绍,包括其核心思想、应用场景和优缺点。 一、创建型模式(Creational Patterns) 创建型模式关注对象的创建࿰…...
日历使用及汉化——fullcalendar前端
官网 FullCalendar - JavaScript Event Calendar 引入项目 <link hrefhttps://cdnjs.cloudflare.com/ajax/libs/fullcalendar/5.10.1/main.min.css relstylesheet /><script srchttps://cdnjs.cloudflare.com/ajax/libs/fullcalendar/5.10.1/main.min.js></sc…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
