当前位置: 首页 > news >正文

数据库(总结自小林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服务器上同时运行了太多的查询,会导致服务器负载过高,从而导致查询变慢

优化:

  1. 分析查询语句
    • 使用 EXPLAIN命令分析 SQL执行计划,找出慢查询的原因,比如是否使用了全表扫描,是否存在索引未被利用的情况等,并根据相应情况对索引进行适当修改。
  2. 查询优化
    • **避免使用SELECT ***,只查询真正需要的列;
    • 使用 覆盖索引,即索引包含所有查询的字段
    • 联表查询最好要以小表驱动大表,并且被驱动表的字段要有索引。最好通过冗余字段的设计,避免 联表查询。
  3. 创建或优化索引
    • 根据 不同查询条件创建合适的索引,特别是经常用于 WHERE子句的字段、orderby 排序的字段、Join 连表查询的字典、 group by的字段
    • 如果查询中经常涉及多个字段,考虑创建 联合索引,使用联合索引要符合最左匹配原则,不然会索引失效
    • 不要用左模糊匹配、函数计算、表达式计算等等,防止索引失效
  4. 分页优化:
    • 针对 limit n,y 深分页的查询优化,可以把Limit查询转换成某个位置的查询:select * from tb_sku where id>20000 limit 10,该方案适用于主键自增的表
  5. 优化数据库表
    • 如果单表的数据超过了千万级别,最好将大表拆分为小表,减轻单个表的查询压力。
    • 也可以将字段多的表 分解成多个表,有些字段使用频率高,有些低,数据量大时,使用频率低的字段会导致 变慢,可以考虑将两者分开
  6. 使用缓存技术
    • 引入缓存层,如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&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;要求排名是从大到小的&#xff0c;因此第 k 个最大元素是排序后的第 k 个元素。你需要设计一个高效的算法来解决这个问题。…...

簡單易懂:如何在Windows系統中修改IP地址?

無論是為了連接到一個新的網路&#xff0c;還是為了解決網路連接問題&#xff0c;修改IP地址都是一個常見的操作。本文將詳細介紹如何在Windows系統中修改IP地址&#xff0c;包括靜態IP地址的設置和動態IP地址的獲取。 IP地址是什麼&#xff1f; IP地址是互聯網協議地址的簡稱…...

Python中的23种设计模式:详细分类与总结

设计模式是解决特定问题的通用方法&#xff0c;分为创建型模式、结构型模式和行为型模式三大类。以下是对每种模式的详细介绍&#xff0c;包括其核心思想、应用场景和优缺点。 一、创建型模式&#xff08;Creational Patterns&#xff09; 创建型模式关注对象的创建&#xff0…...

日历使用及汉化——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…...

视频截断,使用 FFmpeg

使用 FFmpeg 截取视频并去掉 5 分 49 秒后的内容&#xff0c;可以使用以下命令&#xff1a; ffmpeg -i input.mp4 -t 00:05:49 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 192k output.mp4-i input.mp4&#xff1a; 指定输入视频文件 input.mp4。 -t 00:05:49&#x…...

使用系统内NCCL环境重新编译Pytorch

intro&#xff1a; 费了老大劲,来重新编译pytorch&#xff0c;中间报了无数错误。原生的编译好的pytorch是直接用的其自带NCCL库&#xff0c;并且从外部是不能进行插桩的&#xff0c;因为根本找不到libnccl.so文件。下面记录下重新编译pytorch的过程。指定USE_SYSTEM_NCCL1。这…...

1. Klipper从安装到运行

本文记录Klipper固件从安装&#xff0c;配置到运行的详细过程 Klipper是3D打印机固件之一&#xff0c;它通常运行在linux系统&#xff08;常使用Debian&#xff0c;其它的linux版本也可以&#xff09;上&#xff0c;因此需要一个能运行Linux系统的硬件&#xff0c;比如电脑&am…...

docker 卸载与安装

卸载 查询之前安装的docker, 没有查到则不用卸载删除 yum list installed | grep docker 卸载安装包 yum remove docker-* -y 删除镜像、容器、默认挂载卷 rm -rf /var/lib/docker 安装 -ce 安装稳定版本 -y 当安装过程提示选择全部为 "yes" yum install d…...

跨部门文件共享安全:平衡协作与风险的关键策略

在现代企业中&#xff0c;跨部门协作已成为推动业务发展的关键因素。然而&#xff0c;随着信息的自由流动和共享&#xff0c;文件安全风险也随之增加。如何在促进跨部门协作的同时&#xff0c;确保文件共享的安全性&#xff0c;成为了一个亟待解决的问题。 一、明确文件分类与…...

基于单片机的智慧小区人脸识别门禁系统

本设计基于单片机的智慧小区人脸识别门禁系统。由STM32F103C8T6单片机核心板、显示模块、摄像头模块、舵机模块、按键模块和电源模块组成。可以通过摄像头模块对进入人员人脸数据进行采集&#xff0c;识别成功后&#xff0c;舵机模块动作&#xff0c;模拟门禁打开&#xff0c;门…...

【es6】原生js在页面上画矩形及删除的实现方法

画一个矩形&#xff0c;可以选中高亮&#xff0c;删除自己效果的实现&#xff0c;后期会丰富下细节&#xff0c;拖动及拖动调整矩形大小 实现效果 代码实现 class Draw {constructor() {this.x 0this.y 0this.disX 0this.disY 0this.startX 0this.startY 0this.mouseDo…...

【git实践】分享一个适用于敏捷开发的分支管理策略

文章目录 1. 背景2. 分支管理实践2.1. 敏捷开发中分支管理面临的问题2.2. 分支管理策略2.3. 还需要注意的一些问题 3.总结 1. 背景 在实际的开发工作中&#xff0c;我们往往会面临多任务并行研发&#xff0c;多个环境管理的情况&#xff0c;这种情况下&#xff0c;一个合适的分…...

Redis与MySQL如何保证数据一致性

Redis与MySQL如何保证数据一致性 简单来说 该场景主要发生在读写并发进行时&#xff0c;才会发生数据不一致。 主要流程就是要么先操作缓存&#xff0c;要么先操作Redis&#xff0c;操作也分修改和删除。 一般修改要执行一系列业务代码&#xff0c;所以一般直接删除成本较低…...

基于微信小程序的教室预约系统+LW示例参考

1.项目介绍 功能模块&#xff1a;管理员&#xff08;学生管理、教师管理、申请管理、设备管理、报修管理等&#xff09;、普通用户/学生&#xff08;注册登录、申请预约、退订、报修等&#xff09;技术选型&#xff1a;SSM、JSP、uniapp等测试环境&#xff1a;idea2024&#x…...

网站建设的基本要素/非国产手机浏览器

一、基本介绍 Git是一个文件版本管理工具&#xff0c;可以较为方便的进行文件管理&#xff0c;其为分布式的版本管理和同步软件 git只用于维护本地仓库&#xff0c;git也可以与远程代码托管中心进行联动&#xff0c;将本地仓库和远程仓库进行同步&#xff0c;远程仓库可以是Git…...

现在学做网站赚钱吗/如何自己创建网址

引题&#xff1a;大家在日常工作中&#xff0c;我想99%都是用到sqlplus来登陆数据库&#xff0c;对数据库进行管理、调优、配置。那么如果有很多台数据库的时候&#xff0c;我们在连接后全部是统一的SQL>&#xff0c;就有可能发生目前不知道连接那个库上了&#xff0c;当我们…...

像试淘网网站怎么建设/seo快速软件

最近在技术上确实是没有长进,之前孜孜不倦求知欲望,现在其实对技术提不起兴趣了,其实准确说不是没有兴趣,应该是没有激情,或许是因为一直过于劳累的原因,现在不管是身体上,还是精神上都显出过度疲劳的状态.真的希望能够休息一段时间,放开所有的烦恼,回家看看,去看看美丽的大自然…...

网站 asp.net php/北京seo优化推广

整个实验环境所需要的虚拟机机器列表&#xff0c;包括机器名称、IP和所安装所需软件如下表&#xff1a; 服务器角色操作系统机器名IP地址所需安装介质Connection ServerWindows Server 2003 x86view.vmware.com192.168.1.202VMware-viewconnectionserver-x86_64-5.0.0-481677.e…...

黄埭网站建设/西安网站制作价格

增加字段语法&#xff1a;alter table tablename add (column datatype [default value][null/not null],….); 说明&#xff1a;alter table 表名 add (字段名 字段类型 默认值 是否为空); 例&#xff1a;alter table sf_users add (HeadPIC blob); 例&#xff1a;alter table…...

网站建设与管理课程视频/网络推广销售是做什么的

此HTML标签<input id"Radio1" type"radio"/>可完全取代以上2个服务器控件。RadioButtonList及RadioButton依赖于form窗体&#xff0c;产生很多垃圾代码&#xff0c;有时候只是用来显示此方法可取代。aspx:<input type"radio" name"…...