MySQL-03-索引
索引是提高MySQL查询性能的一个重要途径,但过多的索引可能会导致过高的磁盘使用率以及过高的内存占用,从而影响应用程序的整体性能。应当尽量避免事后才想起添加索引,因为事后可能需要监控大量的SQL才能定位到问题所在,而且添加索引的时间肯定是远大于初始添加索引所需要的时间,可见索引的添加也是非常有技术含量的。
1-为什么要使用索引
在数据库中,我们为什么需要使用索引呢?一般有以下几点原因:
(1)索引大大减少存储引擎需要扫描的数据量;
(2)索引可以帮助我们进行排序避免使用临时表;
(3)索引可以把随机IO变为顺序IO;
2-索引的数据结构
通常我们所说的索引是指B-Tree索引,它是目前关系型数据库中查找数据最为常用和有效的索引,大多数存储引擎都支持这种索引。使用B-Tree这个术语,是因为MySQL在CREATE TABLE或其它语句中使用了这个关键字,但实际上不同的存储引擎可能使用不同的数据结构,比如InnoDB就是使用的B+Tree。
B+Tree中的B是指balance,意为平衡。需要注意的是,B+树索引并不能找到一个给定键值的具体行,它找到的只是被查找数据行所在的页,接着数据库会把页读入到内存,再在内存中进行查找,最后得到要查找的数据。
理解B+Tree时,只需要理解其最重要的两个特征即可:第一,所有的关键字(可以理解为数据)都存储在叶子节点(Leaf Page),非叶子节点(Index Page)并不存储真正的数据,所有记录节点都是按键值大小顺序存放在同一层叶子节点上。其次,所有的叶子节点由指针连接。
3-高性能索引策略
前缀索引:如果列很长,通常可以索引开始的部分字符,这样可以有效节约索引空间,从而提高索引效率。
联合索引
(1)一个联合索引可以相当于几个索引,例如(a,b)建立联合索引
select * from tablename where a=’xxx’ and b=’xxx’ (可以使用索引)
select * from tablename where a=’xxx’ (可以使用索引)
select * from tablename where b=’xxx’ (不可以使用索引)
(2)联合索引已经对第二个键值进行了排序处理,例如(userid,buy_date)联合索引,前提是已经先按照userid条件查询。
查询用户userid=1的最近3次购买记录
select * from buy_log where userid=1 order by buy_date desc limit 3
根据该联合索引取出的数据,无须再对buy_date做一次额外的排序操作。如果extra选项中出现using filesort,就是需要额外的一次排序才能完成查询。
对于联合索引(a,b,c)来说,下列语句同样可以直接通过联合索引得到结果:
select * from tablename where a=’xxx’ order by b;
select * from tablename where a=’xxx’ and b=’xxx’ order by c
联合索引的顺序选择:(1)经常被使用列优先;(2)选择性高的列优先;(3)宽度小的列优先
覆盖索引
InnoDB存储引擎支持覆盖索引(covering index),即从辅助索引中就可以查询的记录,而不需要查询聚集索引中的记录。
覆盖索引优点:
(1)辅助索引不包含整行记录的所有信息,故其大小远小于聚集索引,因此可以减少大量的IO操作。
查看执行计划Extra列的Using index就是表示优化器进行了覆盖索引操作。
(2)对某些统计问题而言。
此外,在通常情况下,诸如(a,b)的联合索引,一般是不可以选择b中的所谓的查询条件。但是如果是统计操作,并且是覆盖索引,则优化器会进行选择。
例如:select count(*) from buy_log where buy_date >=’2011-11-01’ and buy_date<=’2013-12-02’
表buy_log有(userid,buy_date)联合索引,这里只根据buy_date进行查询,一般情况下是不能使用该联合索引的,但是这句sql是查询统计操作,并且可以利用到覆盖索引的信息,因此优化器会选择联合索引。
MRR优化Multi-Range Read
MRR从mysql5.6版本开始支持,MRR优化的目的就是为了减少磁盘的随机访问,并且将随机访问转化为较为顺序的数据访问,这对于IO-bound类型的sql查询可带来性能极大的提升。MRR优化可适用于rang,ref,eq_ref类型查询。
MRR优化的好处:
(1)MRR使数据访问变得较为顺序。在查询辅助索引时,首先根据得到的查询结果,按照主键进行排序,并且按照主键排序的顺序进行书签查找。
(2)减少缓冲池中页被替换的次数
(3)批量处理对键值的查询操作。
例如:
Select * from salaries where salary>10000 and salary<40000 (salarys上有辅助索引idx_s)
不启用MRR特性,Extra列显示 using index condition
如果启用MRR特性,Extra除了显示 using index condition,还会显示using MRR
此外,MRR还可以将某些范围查询,拆分为键值对,以此来进行批量的数据查询。这样做的好处是在拆分的过程中,直接过滤一些不符合查询条件的数据。
例如:select * from t where key_part1>1000 and key_part1<2000 and key_part2=10000
表t有(key_part1, key_part2)的联合索引,因此索引根据key_part1,key_part2的位置关系进行排序。若没有MRR,此时查询类型为range,sql优化器会先讲将key_part1大于1000并且key_part1小于2000的数据都取出,即使key_part2不等于10000,取出数据后再根据key_part2进行过滤,这会导致无用数据被取出,尤其是有大量的数据并且key_part2不等于10000。
如果启用了MRR优化,优化器会先将查询条件进行拆分,然后再进行数据查询。
启用MRR:
show variables like 'optimizer_switch'
Mysql5.7默认mrr_cost_base默认标记是on
mrr_cost_base标记表示是否通过cost_base的方式来选择是否启用mrr。如果将mrr设为on,mrr_cost_base设为off,则总是启用MRR优化。
index_condition_pushdown(ICP)
ICP是mysql5.6版本开始支持的,之前版本的mysql数据库不支持ICP,当进行索引查询时,首先根据索引来查找记录,然后再根据where条件来过滤记录。在支持ICP后,mysql数据库在取出索引的同时,判断是否可以进行where条件过滤,也就是将where的部分过滤操作放在了存储引擎层(前提是where的过滤条件是要改索引可以覆盖到的范围)。在某些查询下,可以大大减少上层sql层对记录的索取(fetch),从而提高数据库整体性能。
ICP优化支持range、ref、eq_ref、ref_or_null类型的查询,支持myisam和InnoDB,当优化器选择ICP优化时,可在执行计划列Extra看到Using index condition 提示。
相关文章:

MySQL-03-索引
索引是提高MySQL查询性能的一个重要途径,但过多的索引可能会导致过高的磁盘使用率以及过高的内存占用,从而影响应用程序的整体性能。应当尽量避免事后才想起添加索引,因为事后可能需要监控大量的SQL才能定位到问题所在,而且添加索…...

CSS-长度单位篇
px:像素em:相对元素font-size的倍数rem:相对根字体大小,html标签就是根%:相对父元素计算 注意:CSS中设置长度,必须加单位,否则样式无效!...

自己动手实现一个深度学习算法——七、卷积神经网络
文章目录 1.整体结构2.卷积层1)全连接层存在的问题2)卷积运算3)填充4)步幅5)3维数据的卷积运算6)结合方块思考7)批处理 3.池化层1)池化层的特征 4.卷积层和池化层的实现1)…...

office word 使用笔记
office word 使用笔记 1. 功能1.1 格式快捷键1.2 复选框 2 遇到过的问题2.1 表格标题和表格距离过大 1. 功能 1.1 格式快捷键 复制格式:ctrl shift c 粘贴格式:ctrl shift v 1.2 复选框 方框位置和类型:“插入——高级符号——字体”选…...

vue中下载文件后无法打开的坑
今天在项目开发的时候临时要添加个导出功能我就写了一份请求加导出得代码, 代码: //导出按钮放开exportDutySummarizing (dataRangeInfo) {const params {departmentName: dataRangeInfo.name,departmentQode: dataRangeInfo.qode}//拼接所需得urlcons…...

【追求卓越04】数据结构--栈与队列
引导 今天我们开始学习栈与队列的内容,我觉得栈并不难,所以篇幅也就不会那么多了。在虚拟空间中,栈是用户空间中的一种数据结构,它主要用于保存局部变量。那么问题来了,为什么用栈来保存局部变量,不用别的数…...

基于SpringBoot的超市信息管理系
✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 随着我国经济的不断发…...

【计算机组成原理】存储系统
🎄欢迎来到边境矢梦的csdn博文🎄 🎄本文主要梳理计算机组成原理中 存储系统的知识点和值得注意的地方 🎄 🌈我是边境矢梦,一个正在为秋招和算法竞赛做准备的学生🌈 🎆喜欢的朋友可以…...

基于SSM的旅游管理系统设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
JeecgBoot3.0 漏洞升级 — 快速文档
近几年来,黑客攻击行为呈现出日益复杂和隐蔽的趋势,对个人和组织的安全造成了严重威胁。黑客们不断寻找新的漏洞和安全漏洞,利用各种手段进行网络攻击,包括恶意软件、网络钓鱼、勒索软件等。因此,我们每个人都需要关注…...

6.一维数组——用冒泡法,选择法将5个整数由大到小排序
文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码(冒泡法)程序运行代码(选择法) 前言 本系列为一维数组编程题,点滴成长,一起逆袭。 一、题目描述 用冒泡法将5个整数由大到小排序 二、题目…...

YOLOv8 onnx 文件推理多线程加速视频流
运行环境: MacOS:14.0Python 3.9Pytorch2.1onnx 运行时 模型文件: https://wwxd.lanzouu.com/iBqiA1g49pbc 密码:f40v 下载 best.apk后将后缀名修改为 onnx 即可模型在英伟达 T4GPU 使用 coco128 训练了 200 轮如遇下载不了可私信获取 代码…...

CVE-2017-12615 文件上传
CVE-2017-12615 文件上传 当存在漏洞的Tomcat运行在Windows/Linux主机上, 且启用了HTTP PUT请求方法( 例如, 将readonly初始化参数由默认值设置为false) , 攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传…...

c++没有返回值的返回值
上面的函数search没有返回值,因为a不等于1,但是输出的时候会输出6.这恰巧是x的值,如果我们希望a不等于1时返回x,那么这种结果反而是正确的.有时候这种错误的代码可能产生正确的结果反而会加大debug难度 int search(int n) { 00007FF66DB723E0 mov dword ptr [rsp8],e…...

全网最全卡方检验汇总
一文整理了卡方检验全部内容,包括卡方检验的定义(基本思想、卡方值计算、适用条件分析)、卡方检验分类(2*2四格表卡方、R*C表格卡方、配对卡方、卡方拟合优度检验、分层卡方)、卡方检验如何分析(数据格式、…...
Java基础-中级-高级面试题汇(一)
第一部分: Java基础面试题汇总 1.面向对象和面向过程的区别? 面向对象和面向过程是两种不同的编程思想。面向对象是一种以对象为中心的编程思想,将数据和处理数据的方法封装在一起,形成一个类。程序通过创建对象来调用类中的方法…...

数据结构 / day04 作业
1. 单链表任意位置删除, 单链表任意位置修改, 单链表任意位置查找, 单链表任意元素查找, 单链表任意元素修改, 单链表任意元素删除, 单链表逆置 // main.c#include "head.h"int main(int argc, const char *argv[]) {Linklist headNULL; //head 是头指针// printf(&q…...

Java核心知识点整理大全20-笔记
目录 17. 设计模式 17.1.1. 设计原则 17.1.24. 解释器模式 18. 负载均衡 18.1.1.1. 四层负载均衡(目标地址和端口交换) 18.1.1.2. 七层负载均衡(内容交换) 18.1.2. 负载均衡算法/策略 18.1.2.1. 轮循均衡(Roun…...

Spark---转换算子、行动算子、持久化算子
一、转换算子和行动算子 1、Transformations转换算子 1)、概念 Transformations类算子是一类算子(函数)叫做转换算子,如map、flatMap、reduceByKey等。Transformations算子是延迟执行,也叫懒加载执行。 2)、Transf…...
什么是关系型数据库?
什么是关系型数据库? 关系型数据库(RDBMS)是建立在关系模型基础上的数据库系统。关系模型是一种数据模型,它表示数据之间的联系,包括一对一、一对多和多对多的关系。在关系型数据库中,数据以表格的形式存储…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学
一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件,其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时,价带电子受激发跃迁至导带,形成电子-空穴对,导致材料电导率显著提升。…...
Spring事务传播机制有哪些?
导语: Spring事务传播机制是后端面试中的必考知识点,特别容易出现在“项目细节挖掘”阶段。面试官通过它来判断你是否真正理解事务控制的本质与异常传播机制。本文将从实战与源码角度出发,全面剖析Spring事务传播机制,帮助你答得有…...

SFTrack:面向警务无人机的自适应多目标跟踪算法——突破小尺度高速运动目标的追踪瓶颈
【导读】 本文针对无人机(UAV)视频中目标尺寸小、运动快导致的多目标跟踪难题,提出一种更简单高效的方法。核心创新在于从低置信度检测启动跟踪(贴合无人机场景特性),并改进传统外观匹配算法以关联此类检测…...