【Mysql索引优化】索引优化的最佳实现
文章目录
- 【Mysql优化】索引优化的最佳实现
- 1. 全值匹配:索引的最佳使用方式
- 2. 最左前缀法则
- 3. 尽量使用覆盖索引:优化查询性能。减少 select \* 语句
- 4. 范围查询优化
- 5. 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换)
- 6. 少用不等、空值、OR(IN)
- 6.1 不等于(`!=` 或 `<>`)、NOT IN 、NOT EXISTS 的影响:
- 6.2 IS NULL` 或 `IS NOT NULL 的影响:
- 6.3 使用 `OR` 或 `IN` 的影响:
- 7. 存储引擎不能使用索引中范围条件右边的列
- 8. Like百分写最右
- 9.字符串不加单引号索引失效
- 总结
【Mysql优化】索引优化的最佳实现
前言
在数据库性能优化中,索引是至关重要的工具。合理使用索引不仅可以提高查询效率,还能显著减少数据库的响应时间。本文将从全值匹配、最左前缀法则、覆盖索引和范围查询优化等方面,介绍MySQL中索引优化的最佳实践。
1. 全值匹配:索引的最佳使用方式
全值匹配是指在使用复合索引时,查询条件需要包含索引的所有列,从而最大限度地利用索引。例如:
-- 创建复合索引
CREATE INDEX idx_name_age_position ON employees (name, age, position);-- 全值匹配查询
EXPLAIN SELECT * FROM employees WHERE name = 'John' AND age = 30 AND position = 'Manager';
分析:在上述查询中,复合索引的长度被完整使用(如140字节),查询性能最佳。
2. 最左前缀法则
最左前缀法则要求**复合索引必须从最左列开始查询,且不能跳过列。**例如:
-- 使用复合索引的部分列
EXPLAIN SELECT * FROM employees WHERE name = 'John' AND age = 30;
分析:此查询遵循最左前缀法则,索引长度为78字节,查询效率较高。如果跳过name
列,则索引会失效。
3. 尽量使用覆盖索引:优化查询性能。减少 select * 语句
覆盖索引是指查询结果只依赖索引,而无需访问表。例如:
-- 查询字段包含索引列
EXPLAIN SELECT name, age FROM employees WHERE name = 'John';
优势:通过覆盖索引,查询仅从索引中获取数据,大幅减少了I/O操作。
4. 范围查询优化
范围条件可能导致索引的部分失效,例如:
-- 范围查询
EXPLAIN SELECT * FROM employees WHERE name = 'John' AND age > 30;
解决方案:在可能的情况下,尽量将范围查询拆分为多个小范围,或优化查询逻辑。
5. 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换)
索引底层:将结果与索引中的键值直接匹配。
比如下面函数结果就无法直接与索引中的键值匹配,导致了索引失效。
-- 索引失效
EXPLAIN SELECT * FROM employees WHERE LEFT(name, 3) = 'John';
优化方案:通过范围查询、逻辑调整等避免函数的使用。
6. 少用不等、空值、OR(IN)
6.1 不等于(!=
或 <>
)、NOT IN 、NOT EXISTS 的影响:
!=
查询会导致索引扫描出所有不等于某个值的记录,这样会使得索引的有序性无法发挥作用,因此 MySQL 会选择全表扫描。
EXPLAIN SELECT * FROM employees WHERE name != 'John';
**建议:**如果可能,将不等于条件转为范围查询(如 name > '张三'
和 name < '李四'
),MySQL 更容易使用索引。
因为Mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引。
6.2 IS NULL或
IS NOT NULL 的影响:
在B树或B+树索引中,NULL值通常不具有固定的顺序,因此索引对于这种类型的查询支持较差。
EXPLAIN SELECT * FROM employees WHERE name IS NULL;
建议: emmm,提升有限,尽量不用吧。
6.3 使用 OR
或 IN
的影响:
Mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引。
EXPLAIN SELECT * FROM employees WHERE name in nameList;
建议: 有点像范围查询,可以看第5点。
7. 存储引擎不能使用索引中范围条件右边的列
MySQL 的联合索引(Composite Index)是按照索引字段的顺序来构建的。
每一列的值在索引中是有序排列的,而范围查询(如 >
、<
、BETWEEN
等)会破坏后续字段的有序性,导致索引无法继续使用。
-- 联合索引:
ALTER TABLE `employees` ADD INDEX `idx_name_age_position` (`name`, `age`, `position`);
索引的排列是多层次排序:
- 先按照
name
排序。 - 同样的
name
按照age
排序。 - 同样的
name
和age
按照position
排序。
-- age后续字段的顺序变得不确定,B+ 树无法高效利用这些字段的有序性,导致部分索引失效。
SELECT name, age, position FROM employees WHERE name = 'John' AND age > 18 AND position = 'normal';
优化方案:
-
如果age范围查询能过滤掉大部分数据,那就让他放在索引最左边,别的失效也没关系。
-
拆分查询,将范围查询的部分和其他条件拆开
-- 然后在结果中筛选 position = 'beijing' SELECT name, age, position FROM employees WHERE name = 'John' AND age > 18;
8. Like百分写最右
LIKE模式匹配中的%
如果在开头会导致索引失效:
-- 索引失效
EXPLAIN SELECT * FROM employees WHERE name LIKE '%John';
优化方案:
- 使用覆盖索引,这样索引就算失效了,也不用回表,提高了查询效率。
- 如果不能使用覆盖索引,考虑借助搜索引擎(Elasticsearch等)
9.字符串不加单引号索引失效
就是留意字符串类型的要加引号吧。
-- 索引OK
EXPLAIN SELECT * FROM employees WHERE name = '001';
-- 索引失效
EXPLAIN SELECT * FROM employees WHERE name = 001;
总结
工作中遇到sql调优问题,结合调优工具和对索引的深入理解,应该能够帮助我们解决大部分问题了。
博客主页: 总是学不会.
相关文章:
【Mysql索引优化】索引优化的最佳实现
文章目录 【Mysql优化】索引优化的最佳实现1. 全值匹配:索引的最佳使用方式2. 最左前缀法则3. 尽量使用覆盖索引:优化查询性能。减少 select \* 语句4. 范围查询优化5. 不在索引列上做任何操作(计算、函数、(自动or手动࿰…...
centos使用mkisofs构建无人值守镜像(附官方学习文档)
安装mkisofs yum install -y mkisofs 挂载镜像并确认 并拷贝文件(/mnt 为我们的工作目录) 1.3 准备自动应答文件(保存为 ins.ks) 修改系统引导 实际上就是添加inst.ks 这个引导参数 传递应答文件 传统模式引导 UEFI模式引导 打包镜像 通用选项 -v:启用详细模式&a…...
Python获取当前系统中可用的串口设备
import serial.tools.list_portsdef checkDevice(self):port_data []for port in serial.tools.list_ports.comports():port_data.append(port.description)if port_data:for devInfo in port_data:self.toolLogPrinting(可用设备 devInfo)RET Trueelse:self.toolLogPrinti…...
基于蓝牙通信的手机遥控智能灯(论文+源码)
1.系统设计 灯具作为人们日常生活的照明工具为人们生活提供光亮,本次基于蓝牙通信的手机遥控智能灯设计功能如下: (1)用户可以通过蓝牙通信模块的作用下,在手机端遥控切换智能灯不同的工作模式; &#x…...
【Prometheus 】【实战篇(五)】深入解析 Prometheus 监控指标类型:Counter、Gauge、Histogram 和 Summary
Prometheus 提供了四种核心的指标类型,分别是 Counter(计数器)、Gauge(仪表)、Histogram(直方图)和 Summary(摘要)。这些指标类型在客户端库中有具体的使用说明ÿ…...
进程间通信方式---消息队列(System V IPC)
进程间通信方式—消息队列(System V IPC) 文章目录 进程间通信方式---消息队列(System V IPC)消息队列1.消息队列进程间通信原理2.msgget 系统调用3.msgsnd 系统调用4.msgrcv 系统调用5.msgctl 系统调用6.函数使用案例7.实现生产者…...
【笔记】深度学习模型评估指标
推荐链接: (0)多分类器的评价指标 (1)泛化误差的评价方法:【机器学习】模型评估与选择(留出法、交叉验证法、查全率、查准率、偏差、方差) (2)机器学习&…...
Python语法之列表(包含检测练习)
看完后有没有学会呢?主页有一个列表知识小检测^V^ 关注我更新更多初学实例 主页还有字典的,这个系列会持续更新 列表 列表中的查找数据(index,count,len) 一 列表的格式 【数据1,数据2, 】 index():返回指定数据…...
气象与旅游之间的关系,如果借助高精度预测提高旅游的质量
气象与旅游之间存在密切的关系,天气条件直接影响旅游者的出行决策、旅游体验和安全保障。通过高精度气象预测技术,可以有效提升旅游质量,为游客和旅游行业带来显著的优势。 1. 提高游客出行决策效率 个性化天气服务:基于高精度气象预测,旅游平台可以提供个性化的天气预报服…...
JVM(Java虚拟机)分区详情
JVM(Java虚拟机)运行时数据区是Java虚拟机的内存管理模型,它包括了多个关键的内存区域,这些区域各自承担着不同的职责,共同支持着Java程序的运行。以下是JVM运行时数据区的详细介绍: 一、整体概述 JVM运行时数据区按照线程占用的情况可以分为两类:线程共享和线程独享。…...
计算机组成原理的学习笔记(2)--数据表示与运算·其二 逻辑门和加减乘
学习笔记 前言 本文主要是对于b站尚硅谷的计算机组成原理的学习笔记,仅用于学习交流。 1. 逻辑门 逻辑门是数字电路中用于执行基本逻辑运算的组件。每种逻辑门都有独特的功能和特性: 与门(AND Gate): 符号࿱…...
数据科学与SQL:如何利用本福特法则识别财务数据造假?
目录 0 本福特法则介绍 1 数据准备 2 问题分析 步骤1:提取首位数: 步骤2:计算首位数字的实际频率分布 <...
Mapbox-GL 的源码解读的一般步骤
Mapbox-GL 是一个非常优秀的二三维地理引擎,随着智能驾驶时代的到来,应用也会越来越广泛,关于mapbox-gl和其他地理引擎的详细对比(比如CesiumJS),后续有时间会加更。地理首先理解 Mapbox-GL 的源码是一项复…...
常见网络命令
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 常见网络命令 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 Ping 命令 …...
Ubuntu上如何部署Nginx?
环境: Unbuntu 22.04 问题描述: Ubuntu上如何部署Nginx? 解决方案: 在Ubuntu上部署Nginx是一个相对简单的过程,以下是详细的步骤指南。我们将涵盖安装Nginx、启动服务、配置防火墙以及验证安装是否成功。 1. 更新…...
微店商品详情API:获取商品信息的高效途径
引言 在电商领域,获取商品详情是开发者和商家进行数据分析、精准营销和店铺管理的重要一环。微店作为知名的电商平台,提供了丰富的API接口供开发者使用,其中商品详情API接口尤为关键。本文将详细介绍如何使用微店API接口获取商品详情&#x…...
编程语言注释的方式
Python 单行注释 # 这是一个单行注释多行注释(本质上是跨行字符串) 这是一个多行注释的示例。它可以跨越多行。 """这是一个多行注释的示例。它可以跨越多行。 """ C 单行注释 // 这是一个单行注释 多行注释 /*这是…...
抓住节假日的机会调整ASO优化策略
节日季和全年的特殊活动为提高应用程序的知名度和下载量提供了独特的机会。忽略节假日意味着错过这些有限的扩大用户群的机会。相反,调整您的应用商店优化 (ASO) 策略以适应这些高流量时段至关重要。以下是如何在假期期间最大限度地提高应用程序的性能。 一、为什么…...
AOI外观缺陷检测机
主要功能: 快速检测产品装配缺陷,包括螺丝、元器件、端子排线、二维码、一维条码、识别读码、产品外观 Logo缺陷以及产品标签、字符缺陷检测等产品的缺陷检测。 设备优势:1.采用轻型可移动支架,可以快速对接产线工艺工序&am…...
BERT模型
目录 1.BERT介绍2.BERT框架2.1 Embedding2.2 Transformer Encoder 3.BERT可视化4.注意力六种模式4.1 模式1:注意下一个词4.2 模式2:注意前一个词4.3 模式3:注意相同或相关的单词4.4 模式4:注意“其他”句子中相同或相关词4.5 模式…...
Ubuntu22.04上安装esp-idf
一、安装准备# 建议使用Ubuntu 20.04 或 Ubuntu 22.04 操作系统 为了在 Ubuntu 22.04 中使用 esp-idf,需要安装一些依赖包 sudo apt-get install git wget flex bison gperf python3\python3-pip python3-venv cmake ninja-build ccache\libffi-dev libssl-dev dfu…...
Synchronous Serial Port 协议详解
1、简介 Synchronous Serial Port (SSP) ,基于下图文档的设计标准 1.1、包含3种数据帧格式: a Motorola SPI-compatible interface(以下简称SPI)a Texas Instruments synchronous serial interface(简写SSIÿ…...
BSM和BMS什么区别?
BSM BSM(Battery System Manager)是指用于管理和控制电动车辆的电池系统的设备,其功能包括监测电池状态、控制充放电过程、保护电池安全等。 BMS BMS(Battery Management System)是指用于监测、控制和保护电池组的设…...
基于海思soc的智能产品开发(巧用mcu芯片)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 对于开发车规级嵌入式软件的同学来说,socmcu这样的组合,他们并不陌生。但是传统的工业领域,比如发动机、医疗或…...
R语言混合模型回归GBTM群组轨迹模型绘图可视化研究
全文链接:https://tecdat.cn/?p38581 在回归分析的广袤领域中,面对具有多条未知函数线的复杂数据时,传统方法常常捉襟见肘。混合模型作为一种强有力的分析手段应运而生,其在处理此类复杂情境时展现出独特的优势与潜力(…...
Flink2.0未来趋势中需要注意的一些问题
手机打字,篇幅不长,主要讲一下FFA中关于Flink2.0的未来趋势,直接看重点。 Flink Forward Asia 2024主会场有一场关于Flink2.0的演讲,很精彩,官方也发布了一些关于Flink2.0的展望和要解决的问题。 1.0时代和2.0时代避免…...
android recycleview 中倒计时数据错乱
原因 recyceleview 当页面划出屏幕外后,默认会有两条进入缓存区,这些item的结构会被保存,数据被清除,方便其他新进入屏幕的数据复用item,超过两条外的item会进入缓存池被完全销毁重用。 如果我们的页面上有editText 或…...
康冠科技嵌入式面试题及参考答案
LCD 驱动你自己做了哪些内容? 在 LCD 驱动开发中,首先是硬件层面的理解。需要仔细研究 LCD 的数据手册,明确其引脚定义,包括电源引脚、数据引脚、控制引脚等。比如,对于常见的 RGB 接口 LCD,要清楚哪几个引脚是用于传输红、绿、蓝三种颜色的数据,以及像 VSYNC(垂直同步…...
FreeRTOS的任务调度
1.启动任务调度器 vTaskStartScheduler void vTaskStartScheduler( void ) { BaseType_t xReturn;/* Add the idle task at the lowest priority. */#if ( INCLUDE_xTaskGetIdleTaskHandle 1 ){/* Create the idle task, storing its handle in xIdleTaskHandle so it canbe …...
scala中模式匹配的应用
package test34object test6 {case class Person(name:String)case class Student(name:String, className:String)// match case 能根据 类名和属性的信息,匹配到对应的类// 注意:// 1 匹配的时候,case class的属性个数要对上// 2 属性名不需…...
基于Springboot人口老龄化社区服务与管理平台【附源码】
基于Springboot人口老龄化社区服务与管理平台 效果如下: 系统登陆页面 系统主页面 社区信息页面 社区文件页面 活动报名页面 走访任务管理页面 社区资讯页面 老人信息管理页面 研究背景 随着社会老龄化的加剧,老年人口比例逐渐增加,对老年…...
前端生成docx文档、excel表格、图片、pdf文件
一、前端将页面某区域内容下载为word文档:html-to-docx、file-saver插件组合使用 import HTMLtoDOCX from html-to-docx; import { saveAs } from file-saver;const exportTest async () > {const fileBuffer await HTMLtoDOCX(<h2>文件标题</h2>&…...
Ubantu22系统安装Miniconda3
1、Anaconda和Miniconda异同 清华源镜像的Miniconda3和Anaconda都是用于管理Python环境和软件包的工具,但它们之间存在一些关键的不同之处。下面将分别介绍它们的特点以及使用清华源镜像的差异。 相同点: (1)功能相似:…...
详细解读TISAX认证的意义
详细解读TISAX认证的意义,犹如揭开信息安全领域的一颗璀璨明珠,它不仅代表了企业在信息安全管理方面的卓越成就,更是通往全球汽车供应链信任桥梁的关键一环。TISAX,即“Trusted Information Security Assessment Exchange”&#…...
kubeadm_k8s_v1.31高可用部署教程
kubeadm_k8s_v1.31高可用部署教程 实验环境部署拓扑图**部署署架构****Load Balance****Control plane node****Worker node****资源分配(8台虚拟机)**集群列表 前置准备关闭swap开启ipv4转发更多设置 1、Verify the MAC address and product_uuid are u…...
MyBatis写法汇总
Mybatis写法汇总 1. 批量操作 1.1 批量插入 <insert id"batchInsert" parameterType"java.util.List">INSERT INTO user (username, password, create_time) VALUES<foreach collection"list" item"item" separator"…...
【C++】优先级队列以及仿函数
本篇我们来介绍一下优先级队列 priority_queue 。优先级队列的底层是数据结构中的堆,在C中它是一个容器适配器,这个容器适配器比之前的栈和队列更复杂。 1.priority_queue的介绍 1.1 优先级队列的底层 因为优先级队列就是堆,堆的底层是数组…...
【VUE】13、安装nrm管理多个npm源
nrm(npm registry manager)是一个 npm 源管理器,它允许用户快速地在不同的 npm 源之间进行切换,以提高包管理的速度和效率。以下是对 nrm 使用的详细介绍: 1、安装nrm 在使用 nrm 之前,需要先确保已经安装…...
selenium工作原理
原文链接:https://blog.csdn.net/weixin_67603503/article/details/143226557 启动浏览器和绑定端口 当你创建一个 WebDriver 实例(如 webdriver.Chrome())时,Selenium 会启动一个新的浏览器实例,并为其分配一个特定的…...
Reactor 响应式编程(第三篇:R2DBC)
系列文章目录 Reactor 响应式编程(第一篇:Reactor核心) Reactor 响应式编程(第二篇:Spring Webflux) Reactor 响应式编程(第三篇:R2DBC) Reactor 响应式编程(…...
从零开始掌握 React 前端框架:入门指南与实战案例
🚀 从零开始掌握 React 前端框架:入门指南与实战案例 📖 前言 React 是由 Facebook 推出的前端框架,用于构建高效、可复用的用户界面(UI)。本文将手把手教你如何从零开始掌握 React,内容覆盖 …...
【日常笔记】Spring boot:编写 Content type = ‘text/plain‘ 接口
一、项目场景: 接口:Context-Type:text/plain 方式:POST 项目场景:硬件回调接口 二、实战 PostMapping(value "/xx/xxx", consumes "text/plain" ) 2.1、接口 /*** return String* time 202…...
探索 Seaborn Palette 的奥秘:为数据可视化增色添彩
一、引言 在数据科学的世界里,视觉传达是不可或缺的一环。一个好的数据可视化不仅能传递信息,还能引发共鸣。Seaborn 是 Python 中一款广受欢迎的可视化库,而它的调色板(palette)功能,则为我们提供了调配绚…...
多智能体/多机器人网络中的图论法
一、引言 1、网络科学至今受到广泛关注的原因: (1)大量的学科(尤其生物及材料科学)需要对元素间相互作用在多层级系统中所扮演的角色有更深层次的理解; (2)科技的发展促进了综合网…...
【中标麒麟服务器操作系统实例分享】java应用DNS解析异常分析及处理
了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://documentkylinos.cn 情况描述 中标麒麟服务器操作系统V7运行在 ARM虚…...
设计模式12:状态模式
系列总链接:《大话设计模式》学习记录_net 大话设计-CSDN博客 参考:设计模式之状态模式 (C 实现)_设计模式的状态模式实现-CSDN博客 1.概述 状态模式允许一个对象在其内部状态改变时改变其行为。对象看起来像是改变了其类。使用状态模式可以将状态的相…...
AI @国际象棋世界冠军赛: 从棋盘到科研创新之路
点击屏末 | 阅读原文 | 在小红书和 Google 谷歌回顾 WCC...
LeetCode刷题day29——动态规划(完全背包)
LeetCode刷题day29——动态规划(完全背包) 377. 组合总和 Ⅳ分析: 57. 爬楼梯(第八期模拟笔试)题目描述输入描述输出描述输入示例输出示例提示信息 分析: 322. 零钱兑换分析: 279. 完全平方数分…...
C++对象数组对象指针对象指针数组
一、对象数组 对象数组中的每一个元素都是同类的对象; 例1 对象数组成员的初始化 #include<iostream> using namespace std;class Student { public:Student( ){ };Student(int n,string nam,char s):num(n),name(nam),sex(s){};void display(){cout<&l…...
主曲率为常数时曲面分类
主曲率为常数 ⇔ K , H \Leftrightarrow K,H ⇔K,H 为常数,曲面分类: 1.若 k 1 k 2 0 k_1k_20 k1k20,则 S S S为全脐点曲面——平面的一部分; 2.若 k 1 k 2 ≠ 0 k_1k_2\neq0 k1k20,则 S S S为全脐点曲面——球面的一部分&…...