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 提示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/168915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YB4556 28V、1A、单节、线性锂电池充电IC

YB4556 28V 、 1A 、单节、线性锂电池充电 IC 概述: YB4556H 是一款完整的采用恒定电流 / 恒定电压的高压、大电流、单节锂离子电池线性充电 IC。最高耐压可达 28V&#xff0c;6.5V 自动过压保护&#xff0c;充电电流可达 1A。由于采用了内部 PMOSFET 架构&#xff0c;加上防倒…

鸿蒙开发-ArkTS 语言-循环渲染

鸿蒙开发-ArkTS 语言-状态管理 4. 渲染控制 对于 UI 渲染&#xff0c;可以基于数据结构选择一些内置方法&#xff08;例如&#xff1a;ForEach&#xff09;快速渲染 UI 结构。 4.1 if-else条件渲染 ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态&#xff0c;使…

软著项目推荐 深度学习 python opencv 火焰检测识别 火灾检测

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

Shell编程基础 – 变量(Variables)

Shell编程基础 – 变量&#xff08;Variables&#xff09; Shell Scripting Essentials – Variables Bash变量作为shell脚本的重要组成部分&#xff0c;提供了在Unix/Linux命令行界面操作和保存数据的方法。 本文简要介绍Bash Shell脚本变量的基础知识以及应用&#xff0c;包…

python实现炫酷的屏幕保护程序!

今天写了桌面保护程序。先来看看效果吧。 完全可以作为屏保程序了&#xff0c;老方式&#xff1a;以下是实现的代码&#xff1a; from tkinter import *from time import strftime​def update_time():global i, j current_time strftime(%H:%M:%S)time_label.config(textcu…

arp报文及使用go实现

一、ARP协议报文格式及ARP表 ARP&#xff08;Address Resolution Protocal&#xff0c;地址解析协议&#xff09;是将IP地址解析为以太网的MAC地址&#xff08;或者称为物理地址&#xff09;的协议。在局域网中&#xff0c;当主机或其他网络设备有数据要发送给另一个主机或设备…

开源语音大语言模型来了!阿里基于Qwen-Chat提出Qwen-Audio!

论文链接&#xff1a;https://arxiv.org/pdf/2311.07919.pdf 开源代码&#xff1a;https://github.com/QwenLM/Qwen-Audio 引言 大型语言模型&#xff08;LLMs&#xff09;由于其良好的知识保留能力、复杂的推理和解决问题能力&#xff0c;在通用人工智能&#xff08;AGI&am…

现代图标集wxArtProvider发布 —— 发布于2023年11月21日

Perazz发布了wxMaterialDesignArtProvider&#xff0c;这是一个自定义的wxArtProvider类&#xff0c;从MaterialDesign、SimpleIcons、FontAwesome和FluentUI系统数据集中提供基于SVG的图标。所有这些数据集都有许可证&#xff08;MIT、CC BY 4.0、CC0 1.0、Apache 2.0&#xf…

打破障碍:2024年赋能企业人工智慧生成创新-5个应用场景与6个转型步骤

想要了解如何采用生成式AI来提高企业效率和竞争力&#xff1f;本指南将介绍如何采用生成式AI来实现数字化转型&#xff0c;并打造智能化商业模式。从5大应用场景和6大步骤切入&#xff0c;让您了解如何开启生成式AI创新。立即连线创新专家咨询或观看创新战略方案视频进一步了解…

Leetcode—58.最后一个单词的长度【简单】

2023每日刷题&#xff08;四十&#xff09; Leetcode—58.最后一个单词的长度 实现代码 int lengthOfLastWord(char* s) {int len strlen(s);int left 0, right 0;if(len 1) {return 1;}while(right < len) {if(right 1 < len) {if(s[right] && s[righ…

【spring(五)】SpringMvc总结 SSM整合流程

目录 一、SpringMVC简介&#xff1a; 二、SpringMVC快速入门&#xff1a; 三、SpringMVC bean的管理&#xff1a;⭐ ①配置bean ②扫描bean 四、SpringMVC配置类&#xff1a;⭐ 五、SpringMVC 请求与响应 六、SpringMVC REST风格 七、SSM整合 异常处理&#xff1a; 八、…

今日现货白银价要素分析

现货白银市场每天走势图上的K线&#xff0c;都是由开盘价、收盘价、最高价、最低价四个价格要素组成。K线作为一种特殊的市场语言&#xff0c;不同具体的形态有不同的含义&#xff0c;当收盘价高于开盘价就形成阳线&#xff0c;反之就形成阴线。 如果阳线出现在银价盘整或行情下…

位图的详细讲解

位运算操作符&#xff1a;或&#xff0c;与&#xff0c;异或&#xff0c;按位取反。 操作符 |两个中有一个是一则为一&两个都是一则为一^相同为零&#xff0c;不同为一~零变成一&#xff0c;一变成零 什么是位运算符: 位运算是直接对整型数据的二进制进行运算。 位图概念…

基于UI交互意图理解的异常检测方法

美团到店平台技术部/质量工程部与复旦大学周扬帆教授团队开展了科研合作&#xff0c;基于业务实际场景&#xff0c;自主研发了多模态UI交互意图识别模型以及配套的UI交互框架。 本文从大前端质量保障领域的痛点出发&#xff0c;介绍了UI交互意图识别的方法设计与实现。基于UI交…

告别百度网盘,搭建自己的专属网盘 ——Cloudreve,不限制下载速度!

Cloudreve 是一个用 Go 语言写的公有网盘程序,我们可以用它来快速搭建起自己的网盘服务,公有云 / 私有云都可。 顺哥博客 先来看看文档介绍吧。 支持多家云存储驱动的公有云文件系统. 演示站 • 讨论社区 • 文档 • 下载 • Telegram 群组 • 许可证 :sparkles: 特性 :cl…

初学剪辑者找视频素材就上这6个网站

视频剪辑必备的6个素材网站&#xff0c;高清无水印&#xff0c;还可以免费下载&#xff0c;无版权限制&#xff0c;赶紧收藏起来&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材非常丰富&#xff0c;网站主要以设计类素材为主&#…

初始linux:文件操作

目录 提示&#xff1a;以下指令均在Xshell 7 中进行 linux的理念 一、echo echo "字符串" 二、输出重定向 > > [文件] echo "字符串" > [文件] echo "字符串" > > [文件] 制作大文件 三、< 输入重定向与ca…

短视频ai剪辑矩阵分发saas系统源头技术开发

抖音账号矩阵系统是基于抖音开放平台研发的用于管理和运营多个抖音账号的平台。它可以帮助用户管理账号、发布内容、营销推广、分析数据等多项任务&#xff0c;从而提高账号的曝光度和影响力。 具体来说&#xff0c;抖音账号矩阵系统可以实现以下功能&#xff1a; 1.多账号多…

基于M估计样本一致性算法的点云平面拟合

平面拟合 1、算法简介2、参考文献3、实现效果4、相关代码 1、算法简介 RANSAC 是在给定模型和距离阈值 T T T的情况下&#xff0c;通过寻找最小代价 C C C来确定内点数据并拟合模型。如式&#xff08;1&#xff09;所示的代价函数&#xff0c;当点到模型的距离 e e e小于阈值 T…

webshell之Laravel和yii

EvalLoader#load 免杀效果 EvalLoader#load分析 eval命令执行函数&#xff0c;参数可控 MockTrait#generate 免杀效果 MockTrait#generate函数分析 存在一个eval函数 MockTrait#generate 免杀效果 view#evaluateDynamicContent 免杀效果 view#evaluateDynamicContent分析 总结…