SQL实战之索引优化(单表、双表、三表、索引失效)
文章目录
- 单表优化
- 双表优化
- 三表优化
- 结论
- 索引失效
单表优化
总体原则:建立索引并合理使用,避免索引失效
案例说明:查询category_ id 为1且comments大于1的情况下,views最多的article_ id:
传统方案:
explain select id, author_ id from article where category_ id = 1 AND comments > 1 order by views desc limit 1;
SQL性能分析01:出现全表扫描all、无索引null、以及文件外排序Using filesort,导致性能最差
优化一:新建复合索引(直接3个字段)
create index idx_ article_ CCV on article(category_ id, comments, views);
explain select id, author_ id from article where category_ id = 1 AND comments > 1 order by views desc limit 1;
SQL性能分析02: 解决了全表扫描all、无索引的问题,但是仍然存在Using filesort
原因:comments > 1导致views索引失效,出现文件内排序问题,若comments =1索引不会失效 ,哈哈
优化二:新建索引(优化为两个字段)
create index idx_ article_ CV on article (category_ id, views);
explain select id, author_ id from article where category_ id = 1 AND comments > 1 order by views desc limit 1;
总结:合理设置索引,解决了全表扫描all、无索引、Using filesorting内排序的问题
双表优化
案例说明:查看left join的查询性能以及如何加索引?
传统方案:
explain select * from class LEFT JOIN book ON class.card = book.card;
SQL性能分析01: type查询种类两个都是all全表扫描,性能较差,问题是现在给哪个表加索引,左表calss?右表book?
优化一:左表class主键加索引
create index Y class(card)
explain select * from class LEFT JOIN book ON class.card = book.card;
优化二:右表book主键加索引
create index Y class(card)
explain select * from class LEFT JOIN book ON class.card = book.card;
结论:
- 显然给右表加索引的性能type=ref比左表性能type=range好
- 左连接A left join B给右表B主键加索引性能更高(因为左连接,左表一定都有,性能取决于右表,所以给右表加索引)
- 右连接A right join B给左表A主键加索引性能更高
三表优化
需求:三表连接以及如何加索引
传统方案:
explain SELECT FROM c1ass LEFT JOIN book ON c1ass .card=book .card
LEFT JOIN phone ON book.card=phone .card ;
优化一:后两个表phone、book主键加索引
create index Y phone(card)
create index X book(card)
explain SELECT FROM c1ass LEFT JOIN book ON c1ass .card=book .card
LEFT JOIN phone ON book.card=phone .card ;
后2行的type都是ref且总rows优化很好效果不错。因此索引最好设置在需要经常查询的字段中
结论
1、永远用小结果集驱动大结果集
2、尽可能减少Join语句中的NestedLoop的循环总次数
3、优先优化NestedLoop内层循环次数
4、保证Join语句中被驱动表上Join条件字段已经被索引
5、当无法保证被驱动表的Join条件字段被索引且内存资源充足的前提下,不要太吝惜JoinBuffer的设置;
索引失效
1、全值匹配我最爱
2、最佳左前缀法则:指的是查询从索引的最左前列开始且不跳过索引中的列。(带头大哥不能死,中间兄弟不能断)
3、不在索引列上做任何操作(计算、函数、自动or手动类型转换),会导致索引失效而转向全表扫描type=all(索引列上少计算)
4、不能使用索引中范围条件右边的列(范围之后全失效)
5、尽量使用覆盖索引(索引列和查询列一致),(尽量减少使用select *)
6、like以通配符开头mysql索引失效会变成全表扫描的操作 (like %加右边)
7、字符串varchar不加单引号索引失效(字符串里留引号)
8、is null,is not null, or, != 无法使用索引会导致全表扫描SQL索引优化口诀全值匹配我最爱,最左前缀要遵守;带头大哥不能死,中间兄弟不能断;索引列上少计算,范围之后全失效;LIKE百分写最右,覆盖索引不写星;不等空值还有or,索引失效要少用;VAR引号不可丢,SQL高级也不难!
相关文章:

SQL实战之索引优化(单表、双表、三表、索引失效)
文章目录 单表优化双表优化三表优化结论索引失效 单表优化 总体原则:建立索引并合理使用,避免索引失效 案例说明:查询category_ id 为1且comments大于1的情况下,views最多的article_ id: 传统方案: explain select id, author_ id…...

[7-1] ADC模数转换器 江协科技学习笔记(14个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 DMA(Direct Memory Access,直接内存访问)是一种硬件特性,它允许某些硬件子系统直接访问系统的内存,而无需CPU的介入。这样,CPU就可以处理其他任务,从而提高系…...
SSM整合:Spring+SpringMVC+MyBatis完美融合实战指南
前言 在Java企业级开发领域,SSM(SpringSpringMVCMyBatis)框架组合一直占据着重要地位。这三个轻量级框架各司其职又相互配合,为开发者提供了高效、灵活的开发体验。本文将深入探讨SSM框架的整合过程,揭示整合背后的原…...
Spring Boot分页查询进阶:整合Spring Data REST实现高效数据导航
目录: 引言分页查询基础回顾 2.1 Spring Data JPA分页接口 2.2 Pageable与Page的使用 2.3 常见分页参数设计Spring Data REST简介 3.1 HATEOAS与超媒体驱动API 3.2 Spring Data REST核心功能 3.3 自动暴露Repository接口整合Spring Boot与Spring Data REST 4.1 项目…...

阿里云 Serverless 助力海牙湾构建弹性、高效、智能的 AI 数字化平台
作者:赵世振、十眠、修省 “通过阿里云 Serverless 架构,我们成功解决了弹性能力不足、资源浪费与运维低效的痛点。SAE 的全托管特性大幅降低技术复杂度。未来,我们将进一步探索 Serverless 与 AI 的结合,为客户提供更智能的数字…...
升级node@22后运行npm install报错 distutils not found
从node20升级到node22后,在运行 npm install 的时候报了很多 gyp 错误,其中包括 npm error npm error ModuleNotFoundError: No module named distutils。 问题原因是我在使用 brew install node22 的过程中自动把 python 升级到了 3.13。而 distutils …...

一个开源的多播放源自动采集在线影视网站
这里写自定义目录标题 欢迎使用Markdown编辑器GoFilm简介项目部署1、前置环境准备1.2 redis 配置 film-api 后端服务配置将 GoFilm 项目根目录下的 film 文件夹上传到 linux 服务器的 /opt 目录下 2. 构建运行1. docker 部署1.1 安装 docker , docker compose 环境 注意事项: 2…...
【PhysUnits】10 减一操作(sub1.rs)
一、源码 代码实现了一个类型级别的减一操作(Sub1 trait),通过Rust的类型系统在编译期完成数值减一的计算。 //! 减一操作特质实现 / Decrement operation trait implementation //! //! 提供类型级别的减一计算 / Provides type-level decrement operationuse su…...

深度检测与动态透明度控制 - 基于Babylon.js的遮挡检测实现解析
首先贴出实现代码: OcclusionFader.ts import { AbstractEngine, Material, type Behavior, type Mesh, type PBRMetallicRoughnessMaterial, type Scene } from "babylonjs/core"; import { OcclusionTester } from "../../OcclusionTester"…...
Linux下使用socat将TCP服务转为虚拟串口设备
Linux下使用socat将TCP服务转为虚拟串口设备 socat是一个强大的网络工具,可以将TCP连接转换为虚拟串口设备,这在嵌入式开发、工业控制等领域非常有用。下面详细介绍如何实现这一功能。 基本原理 socat可以通过创建伪终端(PTY)来模拟串口设备ÿ…...

docker push 报错 denied: requested access to the resource is denied
问题:当 docker logout -> docker login 用户登录,但仍然无法 docker push $ docker push <username>/nginx-custom:v1 The push refers to repository [docker.io/jagger/nginx-custom] 340e6d3ea0c7: Preparing 941dd9dd8ee4: Preparing f6…...

epub→pdf | which 在线转换??好用!!
1、PDF派(free&quick) pdf转word_pdf转换成excel_pdf转换成ppt _纬来PDF转换器 评价:目前使用免费,转化的时候有进度条提示,总的来说比较快,50mb的文件在40秒内可以转换完成,推荐 2、pdfconvert(free…...
PBX、IP PBX、FXO 、FXS 、VOIP、SIP 的概念解析以及关系
PBX(Private Branch Exchange) 概念 :PBX 是专用交换机,是一种在企业或组织内部使用的电话交换系统。它允许内部用户之间以及内部用户与外部公共电话网络(PSTN)之间进行通信。例如,在一个大型企…...

MySQL数据高效集成到金蝶云星空的技术分享
MySQL数据集成到金蝶云星空的技术案例分享:SR新建调拨单内部供应商-深圳天一 在企业信息化系统中,数据的高效流动和准确对接是实现业务流程自动化的关键。本文将聚焦于一个具体的系统对接集成案例——将MySQL中的数据集成到金蝶云星空,以支持…...
git 命令之-git cherry-pick
今天得到一个通知,这个业务版本里面部分已经开发但还没测试的内容要新开一个分支提交,但是我已经有几个提交上去了,难道只能一个一个文件复制到新的分支吗?我不,我找到了这个git命令,可以解决我的困惑&…...
如何在STM32CubeMX下为STM32工程配置调试打印功能
为STM32工程配置调试打印功能 一、配置调试用的打印串口 #include <stdio.h> //标准输入输出库//1.在STM32CubeMX中打开并配置好某串口设备; //2.在main.c文件中添加如下代码行对输入输出重定向; //3.在文件开头包含stdio.h头文件。 #pragma im…...

Linux系统 - 基本概念
介绍一些Linux系统的基本概念 1 操作系统的核心—内核 “操作系统”通常包含两种不同含义。 1.指完整的软件包,这包括用来管理计算机资源的核心层软件,以及附带的所有标准软件工具,诸如命令行解释器、图形用户界面、文件操作工具…...
kerberos在无痕浏览器 获取用户信息失败 如何判断是否无痕浏览器
kerberos在无痕浏览器 获取用户信息失败 如何判断是否无痕浏览器 js 代码 其他地方用直接导入js getCurrentUserId 这是自己后端获取 域账号地址 我是成功返回200 //true普通浏览器 fasle 无痕浏览器 export const checkBrowserMode async () > {try {const response a…...
在h5端实现录音发送功能(兼容内嵌微信小程序) recorder-core
本文将通过一个实际的 Vue3 组件示例,带你一步步实现“按住录音,松开发送,上滑取消”的语音录制功能。 我们将使用强大且小巧的开源库 recorder-core,支持 MP3、WAV、AAC 等编码格式,兼容性较好。 🔧 项目…...

PDF电子发票数据提取至Excel
声明:本软件是吾爱大佬th4c3y原创,本人只是搬运工! 发票识别更新记录 【2025-3-14】更新 v2.0 在字段设置中新增自定义字段(仅在 PDF 正则式接口下生效),支持自定义正则表达式或固定字符。 自定义字段会…...

【身份证识别表格】把大量手机拍摄的身份证信息转换成EXCEL表格的数据,拍的身份证照片转成excel表格保存,基于WPF和腾讯OCR的实现方案
基于WPF和腾讯OCR的身份证照片转Excel方案 应用场景 企业人事管理:新员工入职时批量录入数百份身份证信息,传统手动录入易出错且耗时。通过OCR自动提取姓名、身份证号等字段,生成结构化Excel表格,效率提升10倍以上。 …...

FPGA高速接口 mipi lvds cameralink hdml 千兆网 sdi
mipi: https://blog.csdn.net/SDJ_success/article/details/146541776 cameralink CameraLink协议 CameraLink协议是一种专门针对机器视觉应用领域的串行通信协议,它使用低压差分信号(LVDS)进行数据的传输和通信。CameraLink标准是在ChannelLink标准的基础上多加了…...

Linux路径解析指南:逻辑路径 vs 实际路径详解
在 Linux 系统中,逻辑路径(Logical Path)和 实际路径(Physical Path)是两个不同的概念,主要区别在于它们如何解析文件或目录的位置。以下是详细解释: 目录 1. 逻辑路径(Logical Path…...

Azure 公有云基础架构与核心服务:从基础到实践指南
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 Azure 的基础架构由多个核心组件构成,理解这些概念是掌握其技术框架的第一步: 地理区域(Geographic R…...

【运维_日常报错解决方案_docker系列】一、docker系统不起来
今天忽然想起来哎,还有一台”尘封“着的服务器,好久没用了,就随便打开登了登,然后想看一下服务器上面还有正在跑着的容器服务吗,然后使用docker ps 发现报错了。 然后重启也是下面这个状态。 查看docker状态…...

C# 数组与字符串:全面解析与应用实践
在C#编程语言中,数组和字符串是两种最基础也是最重要的数据类型。无论是简单的控制台应用程序,还是复杂的企业级系统,数组和字符串都扮演着不可或缺的角色。本文将全面深入地探讨C#中数组和字符串的特性、使用方法、性能考量以及实际应用场景…...
前端vue中使用signalr
一、引入SignalR库 使用NPM引入SignalR库 npm install @microsoft/signalrJs文件中引入 import * as signalR from @microsoft/signalr;二、初始化连接 这一步需要指定SignalR Hub的URL。 const connection = new signalR.HubConnectionBuilder().withUrl("https://y…...
Stable Diffusion底模对应的VAE推荐
以下是主流Stable Diffusion底模对应的VAE推荐表格: 底模版本推荐VAE类型说明SD1.5SD1.5专用VAE通常使用vae-ft-mse-840000-ema-pruned.safetensorsSD2.0SD1.5兼容VAE或SD2专用VAE部分SD2模型需配套512-ema-only.vae.ptSD3内置VAESD3系列模型通常自带集成VAE无需额…...
centos7.5安装kubernetes1.25.0
centos7.5安装kubernetes centos7.5kubernetes1)准备阶段准备2台虚拟机配置静态IP修改主机名桥接设置配置阿里云的repo源配置k8s切国际源配置时间同步安装基础软件包 2)安装containerd服务安装配置开启启动 3)安装k8s4)安装kubersphere下载helm安装包解压将helm配置…...

AT2659S射频前端芯片技术解析:L1频段低噪声高增益GNSS信号放大
以下是关于AT2659S L1频段卫星导航射频前端芯片的客观描述,严格基于用户提供的原始信息,采用分享式表述,保持参数和核心内容不变: AT2659S芯片概述 AT2659S是一款基于SiGe工艺的射频前端芯片,专为L1频段&#…...