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

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

CSS-长度单位篇

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

自己动手实现一个深度学习算法——七、卷积神经网络

文章目录 1.整体结构2.卷积层1&#xff09;全连接层存在的问题2&#xff09;卷积运算3&#xff09;填充4&#xff09;步幅5&#xff09;3维数据的卷积运算6&#xff09;结合方块思考7&#xff09;批处理 3.池化层1&#xff09;池化层的特征 4.卷积层和池化层的实现1&#xff09…...

office word 使用笔记

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

vue中下载文件后无法打开的坑

今天在项目开发的时候临时要添加个导出功能我就写了一份请求加导出得代码&#xff0c; 代码&#xff1a; //导出按钮放开exportDutySummarizing (dataRangeInfo) {const params {departmentName: dataRangeInfo.name,departmentQode: dataRangeInfo.qode}//拼接所需得urlcons…...

【追求卓越04】数据结构--栈与队列

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

基于SpringBoot的超市信息管理系

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

【计算机组成原理】存储系统

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

基于SSM的旅游管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

JeecgBoot3.0 漏洞升级 — 快速文档

近几年来&#xff0c;黑客攻击行为呈现出日益复杂和隐蔽的趋势&#xff0c;对个人和组织的安全造成了严重威胁。黑客们不断寻找新的漏洞和安全漏洞&#xff0c;利用各种手段进行网络攻击&#xff0c;包括恶意软件、网络钓鱼、勒索软件等。因此&#xff0c;我们每个人都需要关注…...

6.一维数组——用冒泡法,选择法将5个整数由大到小排序

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

YOLOv8 onnx 文件推理多线程加速视频流

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

CVE-2017-12615 文件上传

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

c++没有返回值的返回值

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

全网最全卡方检验汇总

一文整理了卡方检验全部内容&#xff0c;包括卡方检验的定义&#xff08;基本思想、卡方值计算、适用条件分析&#xff09;、卡方检验分类&#xff08;2*2四格表卡方、R*C表格卡方、配对卡方、卡方拟合优度检验、分层卡方&#xff09;、卡方检验如何分析&#xff08;数据格式、…...

Java基础-中级-高级面试题汇(一)

第一部分&#xff1a; Java基础面试题汇总 1.面向对象和面向过程的区别&#xff1f; 面向对象和面向过程是两种不同的编程思想。面向对象是一种以对象为中心的编程思想&#xff0c;将数据和处理数据的方法封装在一起&#xff0c;形成一个类。程序通过创建对象来调用类中的方法…...

数据结构 / 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. 四层负载均衡&#xff08;目标地址和端口交换&#xff09; 18.1.1.2. 七层负载均衡&#xff08;内容交换&#xff09; 18.1.2. 负载均衡算法/策略 18.1.2.1. 轮循均衡&#xff08;Roun…...

Spark---转换算子、行动算子、持久化算子

一、转换算子和行动算子 1、Transformations转换算子 1&#xff09;、概念 Transformations类算子是一类算子&#xff08;函数&#xff09;叫做转换算子&#xff0c;如map、flatMap、reduceByKey等。Transformations算子是延迟执行&#xff0c;也叫懒加载执行。 2)、Transf…...

什么是关系型数据库?

什么是关系型数据库&#xff1f; 关系型数据库&#xff08;RDBMS&#xff09;是建立在关系模型基础上的数据库系统。关系模型是一种数据模型&#xff0c;它表示数据之间的联系&#xff0c;包括一对一、一对多和多对多的关系。在关系型数据库中&#xff0c;数据以表格的形式存储…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

2025-05-08-deepseek本地化部署

title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek&#xff1a;小白也能轻松搞定&#xff01; 如何给本地部署的 DeepSeek 投喂数据&#xff0c;让他更懂你 [实验目的]&#xff1a;理解系统架构与原…...

aurora与pcie的数据高速传输

设备&#xff1a;zynq7100&#xff1b; 开发环境&#xff1a;window&#xff1b; vivado版本&#xff1a;2021.1&#xff1b; 引言 之前在前面两章已经介绍了aurora读写DDR,xdma读写ddr实验。这次我们做一个大工程&#xff0c;pc通过pcie传输给fpga&#xff0c;fpga再通过aur…...

生成对抗网络(GAN)损失函数解读

GAN损失函数的形式&#xff1a; 以下是对每个部分的解读&#xff1a; 1. ⁡, ​ &#xff1a;这个部分表示生成器&#xff08;Generator&#xff09;G的目标是最小化损失函数。 &#xff1a;判别器&#xff08;Discriminator&#xff09;D的目标是最大化损失函数。 GAN的训…...