【从删库到跑路】MySQL数据库的索引(二)——索引的使用和选择

news2024/11/25 0:50:44

🎊专栏【MySQL】
🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。
🎆音乐分享【The Right Path】
🥰欢迎并且感谢大家指出小吉的问题

文章目录

  • 🍔索引的使用
    • ⭐验证索引效率
      • 🎈细节
    • ⭐最左前缀法则
    • ⭐范围查询
    • ⭐索引失效的情况
    • 🌺SQL提示
      • 🎈告诉数据库使用什么索引(use)
      • 🎈告诉数据库不使用什么索引(ignore)
      • 🎈告诉数据库必须使用什么索引(force)
    • 🏳️‍🌈前缀索引
    • 🎄覆盖索引
  • 🍔单列索引和联合索引的选择问题
    • ✨单列索引
    • ✨联合索引
  • 🍔索引设计原则

在这里插入图片描述

🍔索引的使用

⭐验证索引效率

🎈没有创建索引时,执行SQL语句,查看SQL的耗时
在这里插入图片描述

🎈创建索引后,执行SQL语句,查看SQL的耗时

在这里插入图片描述
比较发现,时间减少了

🎈细节

创建索引相当于在构建B+Tree
所以创建索引也需要花时间

⭐最左前缀法则

最左前缀法则就是查询从索引的最左列开始,并且不跳过索引中的列
如果索引了多列(联合索引),要遵循最左前缀法则

🏳️‍🌈查询索引的时候,必须包含最左边的一列,否则不满足最左前缀法则,索引失效
在这里插入图片描述

查询的时候,如果
跳过了最左边的列,索引全部失效
跳过了其中的某一列(不是最左边的),索引部分失效

⭐范围查询

联合查询在出现范围查询(>,<)时,范围查询右侧的列索引失效
在这里插入图片描述

在业务允许的情况下,尽量使用>=这样子的查询

⭐索引失效的情况

🏳️‍🌈在索引列上使用运算操作(例如substr函数),索引将失效
在这里插入图片描述

🏳️‍🌈字符串类型的字段使用时,不加引号,索引将失效
在这里插入图片描述

🏳️‍🌈模糊查询
如果仅仅是尾部模糊匹配,索引不会失效
在这里插入图片描述

如果是头部模糊匹配,索引失效
如果在查询大数据的情况下,一定要规避这种情况
在这里插入图片描述
🏳️‍🌈or连接的条件
使用or分割开的条件,如果or前的条件中列有索引,而后面的列没有索引,那么涉及的索引不会被用到
如下面的例子,由于age没有索引,所以即使id,phone有索引,索引也会失效
在这里插入图片描述

为了解决这个问题,我们要针对age建立索引
在这里插入图片描述
🏳️‍🌈数据分布影响
如果MySQL 的优化器 认为使用索引比全表更慢,那么不使用索引
(是MySQL自己进行评估认为的结果)
比如进行查询一个数据
用户:查询什么什么东西
MySQL:找一个更快的方式,比如使用全表扫描比索引快,那么采用全表扫描了
在这里插入图片描述

使不使用索引,是由表中的数据决定的,而不是固定的

🌺SQL提示

SQL提示是指在使用SQL语言编写数据库查询或操作时,数据库管理系统(如MySQL、Oracle、SQL Server等)提供的辅助功能。这些提示可以帮助用户更快地完成SQL语句,减少错误,并提供有关数据库结构和数据的相关信息。
简单来说,就是在SQL语句里面添加一些人为的提示来达到优化操作的目的

🎈告诉数据库使用什么索引(use)

这个是建议MySQL使用这个索引,但是是否要使用,MySQL还是要自己去权衡一下

explain select * from 表名 use index(索引名) where 条件;

🎈告诉数据库不使用什么索引(ignore)

explain select * from 表名 use index(索引名) where 条件;

🎈告诉数据库必须使用什么索引(force)

explain select * from 表名 force index(索引名) where 条件;

🏳️‍🌈前缀索引

当字段类型为字符串(varchar,text)时,有时候需要索引很长的字符串,会使索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率
这个时候我们就可以使用前缀索引,仅对字符串的一部分前缀,建立索引,这样子可以大大节约索引空间,从而提高索引效率

create index 索引名 on 表名(字段名(前缀长度n));

🎈前缀长度n

可以根据索引的选择性来使用,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高,查询效率越高
唯一索引的选择性是1,是最好的索引选择性,性能也是最好的

🎈获取索引选择性的方法

可以使用下面的公式来实现

select count(distant 字段名)/count(*) from 表名;

在这里插入图片描述
可以分步计算,康康过程
在这里插入图片描述
✨如果是针对前缀索引进行计算,那么公式里面要加上substring

select count(distant substring(字段名,起始字母,截取的字母个数))/count(*) from 表名;

在这里插入图片描述
可以通过多次计算,找到最合适的前缀长度

🎈查询过程
在这里插入图片描述

🎄覆盖索引

MySQL的覆盖索引是一种特殊的索引类型,它包含了查询所需的所有列,从而使得查询可以直接通过索引本身来完成,而无需再去访问实际的数据行。通常,数据库查询需要根据索引定位到相应的数据行,然后再从数据行中获取所需的列值。但是,使用覆盖索引,MySQL可以在索引中找到所有需要的列,避免了额外的数据行查找尽量减少select *的使用,从而提高了查询性能。

🍔单列索引和联合索引的选择问题

🎆单列索引:一个索引仅仅包含一个列
🎆联合索引:一个索引包含多个列

✨单列索引

使用单列索引的时候,发现MySQL优化器会选择其中一个查询效率比较高的一个索引
在这里插入图片描述

✨联合索引

使用联合索引的时候,MySQL优化器会选择联合索引

在这里插入图片描述

多条件联合查询的时候,MySQL优化器会评估哪个字段的索引效率更高,会选择该字段完成本次查询

在这里插入图片描述

🍔索引设计原则

在这里插入图片描述
在这里插入图片描述

🥰如果大家有不明白的地方,或者文章有问题,欢迎大家在评论区讨论,指正🥰

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

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

相关文章

Linux系统之安装MySQL8.0版本

Linux系统之安装MySQL8.0版本 一、MySQL介绍1.1 MySQL简介1.2 MySQL特点 二、本次实践介绍2.1 环境规划2.2 本次实践目的 三、卸载mariadb数据库3.1 卸载mariadb数据库3.2 卸载mysql数据库 四、配置yum仓库4.1 下载rpm文件4.2 配置yum仓库4.3 检查yum仓库状态4.4 检查mysql版本…

香橙派Zero2基于wiringPi外设库的实验(超声波测距)

超声波测距原理&#xff0c;原理可以查看下面的文章&#xff0c;这里就不赘述了 [51单片机超声波测距](http://t.csdn.cn/eYbod)在Linux中使用超声波测距会用到的时间相关的API和结构体 包含的头文件以及函数原型和时间结构体timveal原型#include<sys/time.h>int getti…

windows部署安装redis安装教程

1、下载redishttps://github.com/tporadowski/redis/releases 2、下载完然后双击安装 比较简单 略过 3、测试是否安装成功 提示bug Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf …

ffplay播放器剖析(8)----逐帧/音量调节/快进快退/倍数分析

文章目录 1.逐帧播放2. 音量调节3. seek 快进 快退4.倍速 1.逐帧播放 逐帧播放就是按s键触发的,调用step_to_next_frame触发 static void step_to_next_frame(VideoState *is) {/* if the stream is paused unpause it, then step */if (is->paused)stream_toggle_pause(i…

jmeter随记2:压测

jmeter随记1:压测 简述一、压测步骤二、观察cpu和内存占用情况三、查看磁盘占用情况 简述 关于压测&#xff0c;jmeter更直观的作用是用来编写压测脚本【请求和压测策略】&#xff0c;然后在linux服务器上执行&#xff0c;也可以在本地执行&#xff0c;压测执行脚本在启动jmet…

PHP注册/登录/发邮件--【强撸项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 上效果图phpStudy 设置导数据库程序基本流程项目目录如图&#xff1a;注册zhuce.html配套资源作业&#xff1a; 本系列校训 用免费公开视频&#xff0c;卷飞培训班哈人&…

Oracle物化视图刷新和物化视图日志

Oracle物化视图刷新和物化视图日志 Oracle的物化视图是包括一个查询结果的数据库对像&#xff0c;它是远程数据的的本地副本&#xff0c;或者用来生成基于数据表求和的汇总表。 测试物化视图的刷新&#xff0c;参考物化视图日志&#xff0c;一个源表对应多个物化视图刷新。 物…

【Linux工具篇】项目自动构建化工具-make/Makefile

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【Linux专栏】&#x1f388; 本专栏旨在分享学习Linux的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 &#x1f4ab…

matlab cross()函数叉乘 计算过程详解

向量叉乘 在数学上&#xff0c;两向量的叉乘是一个过两相交向量的交点且垂直于两向量所在平面的向量。在Matlab中&#xff0c;用函数cross实现。 函数 cross() 格式 C cross(A,B) %若A、B为向量&#xff0c;则返回A与B的叉乘&#xff0c;即CAB&#xff0c;A、B必须是3个…

c#封装bool到cpp

c#那边传一个结构体&#xff0c;结构体里包含两个bool&#xff0c;封送到cpp&#xff0c;结果发现cpp那边读取有问题。一看cpp接收变量的内存&#xff0c;两个bool占的内存都不是一个字节了&#xff0c;再次记录原因。 封送的时候&#xff0c;默认是占4个字节&#xff0c;如果…

Pycharm----导入库文件夹不在py文件的目录下

问题描述&#xff1a; 想在不同目录下导入根目录的包&#xff0c;直接写会报错。如下边object_detect.py在function文件夹下&#xff0c;导入包默认在这个文件下&#xff0c;但我想导入根目录models和utils下的包 解决方法&#xff1a; 将根目录设置为源代码根目录&#xff0…

linux静态库,动态库总结

1.介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据&#xff0c;这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化&#xff0c;更容易重新编译&#xff…

【Spring Cloud】Hystrix熔断机制

文章目录 前言什么是hystrix的熔断&#xff1f;使用hystrix熔断功能的配置Hystrix 工作原理Hystrix工作流 前言 什么是hystrix的熔断&#xff1f; hystrix熔断主要是指在一定的时间窗口内&#xff0c;当请求的次数达到一定的失败比率后&#xff0c;hystrix就会主动拒绝服务&a…

【图像分割】基于浣熊优化算法COA的Otsu(大津法)多阈值电表数字图像分割 电表数字识别【Matlab代码#52】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. 原始COA算法1.1 开发阶段1.2 探索阶段 2. 多阈值Otsu原理3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】 1. 原始…

长尾式差分放大电路

3.3.2差分放大电路 电路 条件 静态分析 对共模信号的抑制作用 当产生温度变化时&#xff0c;也类似加入了共模信号&#xff0c;由于负反馈电阻 的存在&#xff0c;会产生如下变化。 对差模信号的放大作用 电路 交流等效电路 具体分析 具有恒流源的差分放大电路 电路 详细分析…

STM32 OLED显示汉字及屏幕滚动(I2C协议)

文章目录 一、任务目标二、材料准备硬件&#xff1a;软件&#xff1a; 三、AHT20温湿度传感器的使用四、OLED的使用1.硬件2.字模汉字编码原理取字模 3.工程4.电路连接5.实验效果 五、总结六、参考资料 一、任务目标 理解OLED屏显和汉字点阵编码原理&#xff0c;使用STM32F103的…

Linux下基本指令 -> ls指令

​ Linux - ls 1 简介2 简介3 语法4 常用选项4.1 -a 列出目录下的所有文件&#xff0c;包括以 . 开头的隐含文件4.2 -l 列出文件的详细信息4.3 -d 将目录象文件一样显示&#xff0c;而不是显示其下的文件4.4 -i 输出文件的 i 节点的索引信息4.5 -n 用数字的 UID,GID 代替名称4.…

Qt学习14:Designer设计师

文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 Qt项目地址及源码&#xff1a;点击这里 什么是Designer设计师&#xff1f; 简单来说就是通过拖拖拽拽就可以实现窗口上控件的布局。 1. 创建带UI文件的项目 我们在之前的学习中都是不用这个按钮的&#xff0c;现在我们需…

富文本CKEditor5简易入门,包括自定义上传图片(html版+vue.js)

一、安装及引入 官网&#xff1a;https://ckeditor.com/ckeditor-5/download/ 我这边使用的是自定义构建&#xff0c;然后下载下来。 二、简单使用 引入js <script src"../../../assets/plugins/ckeditor5/ckeditor.js"></script>html&#xff1a;…

【PWN · ret2libc】[BJDCTF 2020]babyrop

这题是经典的ret2libc&#xff0c;而且保护开的也不多&#xff0c;实际上&#xff0c;这篇博客的意义更大&#xff1a; 【PWN ret2libc】[2021 鹤城杯]babyof_Mr_Fmnwon的博客-CSDN博客 目录 前言 一、题目 二、思路 三、exp具体编写 总结 前言 简单而纯粹的ret2libc&am…