MySQL 索引使用(二)

本篇继续介绍有关索引的使用。

目录

一、SQL提示

 二、单列索引和联合索引

三、覆盖索引

四、前缀索引

 五、索引的使用原则


一、SQL提示

我们在使用索引来进行查询时,很有可能会出现一个字段中包含多个索引的情况,例如这里有一个name字段,该字段关联了两个索引

当我们根据这个字段进行查询时,这两个索引都有可能会用到 那为什么最后用了i_n_g这个索引呢?这是MySQL替我们选择的,那可不可以指定使用哪个索引呢?其实是可以的,我们只需要在查询时给MySQL一个提示,让其使用某个索引,但这仅仅只是提示,具体使用哪个索引,还需要MySQL自行进行评估选择。

下面我们再来进行一次前面的查询语句,并提示MySQL要使用 i_u_n这个索引

语法如下:

select 字段名 from 表名 use index(要使用的索引名) 查询条件

我们还可以提示MySQL要忽略某个索引,具体如下:

select 字段名 from 表名 ignore index(要忽略的索引名) 查询条件

 

我们也可以强制MySQL使用某个索引 ,具体如下:

select 字段名 from 表名 force index(要强制使用的索引名) 查询条件

 二、单列索引和联合索引

在MySQL中,我们可以根据单个字段构建索引(单列索引),也可以根据多个字段共同创建索引。单列索引的结构为B+Tree,并根据这单个字段的值进行大小比较。

联合索引同样为B+Tree结构,它会先根据最左边的字段来建树,如果最左边的字段值相同,则会以后一个字段值进行比较,以此类推。

 

三、覆盖索引

前面的文章中我们介绍过索引可以根据存储方式 的不同分为聚集索引和二级索引,聚集索引的叶子节点中包含一整条记录,而叶子节点的值则只包含索引的字段和主键字段的值。因此,在使用二级索引来进行查询时,如果查询的字段不只有索引的字段和主键的字段,那么将会进行回表操作,但如果查询的字段包括在索引的字段和主键的字段里,那么将不会回表,直接就能返回查询结果,此时使用的索引就可以称之为覆盖索引。

例如,下面这条SQL

(该表包含id,name,age三个字段) 

可以发现,这条SQL查询的字段除了索引的字段(name)和主键的字段(id)外,还有一个age字段,因此,该次查询回表了,该索引也就不是覆盖索引。

我们通过profile来查看一下此次查询的时间

接下来我们再删掉name字段的索引,然后再根据name和age字段来创建一个联合索引 

此时我们再进行前面的查询语句,然后再通过profile查看一下执行时间 

 

可以发现这次查询要更快一点,这是因为查询的字段全部包含在联合索引和主键的字段里了,此次次使用的索引为覆盖索引,不再回表了。因此,我们还可以得出一个经验:当查询的字段比较多时,尽量创建联合索引来形成覆盖索引,从而避免回表操作,增强查询的效率。

四、前缀索引

当我们对字符串类型的字段创建索引时,需要对该字段的值进行比较,而字符串的比较,需要比较字符串中的字符,如果字符串比较长的话,那么比较的时间就会比较长,例如“hello,word”和“hello,words”需要比较10次才能比较出结果,这样就会导致比较所消耗的时间较长,影响查询的性能,因此我们可以选择只取该字符串的前缀来进行比较,这样就能让比较消耗的性能更少一点。像这种只比较字符串前缀创建的索引就为前缀索引,下面我们来看一下如何创建前缀索引。

创建前缀索引的语法如下:

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

这里有一个name字段 ,我们给它加上一个前缀索引:

此时,我们就给name字段创建好长度为5的前缀索引了。

 这个前缀长度要怎么确定呢?我们可以枚举前缀的长度,并查看该长度的不重复的前缀占全部记录的比值,如果该比值在某个值以上就可以以该长度作为前缀长度,例如,我们以1作为前缀长度,然后我们通过MySQL查询比值,​​​​​​​

可以发现这个比值较低,因此1不适合作为前缀长度 ,我们再来看一下2作为前缀长度

此时比值达到了1因此2适合作为前缀长度。 

 五、索引的使用原则

索引的使用会大大提升我们的查询效率,但索引并不是一定会生效,会有索引失效的情况场景出现,同时,索引也不一定就能提升查询效率,有时甚至还会降低我们的查询效率,因此正确的使用索引是尤为重要的,,下面我们来看一下索引使用时应遵循的原则。

  • 创建索引的表的数据量尽可能多,且该表的查询操作占比要大于修改操作的占比。
  • 对需要进行查询,排序,分组等操作的字段创建索引。
  • 如果字段为字符串类型,应尽量根据情况创建前缀索引。
  • 查询的字段多时,尽量创建联合索引,从而做到覆盖索引。
  • 索引的数量不是越多越好,应当根据需求创建索引,不要不需要索引的字段也创建索引了
  • 如果索引的字段不能存放null值,尽量再建表时对该字段进行not null约束,当MySQL知道哪个字段不含NULL值时,能够更好的确定使用哪个索引性能更好。

 

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

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

相关文章

从零开始学习Slam-旋转矩阵旋转向量四元组(二)

本文参考:计算机视觉life 仅作笔记用 书接上回,上回不清不楚的介绍了旋转矩阵&旋转向量和四元组 现在回顾一下重点: 本着绕谁谁不变的变则 假设绕z轴旋转θ,旋转矩阵为: 再回顾一下旋转向量的表示以及这个基本记不…

SpringCloud如何实现SSO单点登录?

目录 一、SpringCloud框架介绍 二、什么是SSO单点登录 三、单点登录的必要性 四、SpringCloud如何实现SSO单点登录 一、SpringCloud框架介绍 Spring Cloud是一个基于Spring Boot的微服务架构开发工具集,它整合了多种微服务解决方案,如服务发现、配置…

SpringSecurity6从入门到实战之Filter过滤器回顾

SpringSecurity6从入门到实战之Filter过滤器回顾 如果没有SpringSecurity这个框架,我们应该通过什么去实现客户端向服务端发送请求时,先检查用户是否登录,登录了才能访问.否则重定向到登录页面 流程图如下 官方文档:https://docs.spring.io/spring-security/referen…

Ubuntu (18.04) _Mysql (8.0.X)设置密码强度

首先 查看是否有密码强度插件: SHOW PLUGINS; 如果没有,则安装 install plugin validate_password soname validate_password.so; 再次查看,会看到密码强度插件已开 其次 查看密码强度具体配置 show variables like validate_password%; validate…

echart扩展插件词云echarts-wordcloud

echart扩展插件词云echarts-wordcloud 一、效果图二、主要代码 一、效果图 二、主要代码 // 安装插件 npm i echarts-wordcloud -Simport * as echarts from echarts; import echarts-wordcloud; //下载插件echarts-wordcloud import wordcloudBg from /components/wordcloudB…

uniapp实现图片上传——支持APP、微信小程序

uniapp实现图片、视频上传 文章目录 uniapp实现图片、视频上传效果图组件templatejs 使用 相关文档: 结合 uView 插件 uni.uploadFile 实现 u-upload uploadfile 效果图 组件 简单封装,还有很多属性…,自定义样式等…根据个人所需调整 te…

16:00面试,16:08就出来了,问的问题有点变态。。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到8月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…

【C语言】常见的动态内存的错误

前言 在动态内存函数的使用过程中我们可能会遇到一些错误,这里将常见的错误进行总结。 对NULL解引用 请看以下代码: 可以看到,这时我们的malloc开辟是失败的,所以返回的是空指针NULL,而我们却没有进行检查&#xff0…

推荐:4本易发表的优质SSCI期刊,含期刊官网!

01、Risk Management and Healthcare Policy 开源四区,国人发表占比25%,发表量前三的国家分别是中国、埃塞俄比亚和美国。 该期刊对国人友好,年度发文量400多,影响因子3.6。 主要刊发公共卫生相关的文章。 研究者可以围绕居民…

推荐系统三十六式学习笔记:01|你真的需要个性化推荐系统吗?

目录 什么是推荐系统你需要推荐系统吗总结 什么是推荐系统 让我们来换一个角度回答三个问题,从而重新定义什么是推荐系统: 1、它能做什么? 2、它需要什么? 3、它怎么做。 对于第一个问题“它能做什么”,我的回答是:推…

2020年CSP-J入门级第一轮初赛真题

一、选择题 在内存储器中每个存储单元都被赋予一个唯一的序号,称为()。 A.地址 B. 序号 C. 下标 D. 编号 答案:A. 地址 在内存储器中,每个存储单元都有一个唯一的标识,用于区分和访问不同的存储单元。这个唯…

说说你对单例模式的理解?如何实现?

一、是什么 单例模式(Singleton Pattern):创建型模式,提供了一种创建对象的最佳方式,这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建 在应用程序运行期间&am…

day23--单元测试-反射-注解-动态代理

day23-单元测试、反射 恭喜同学们,Java主要的知识我们其实已经学习得差不多了。今天同学们再把单元测试、反射、注解、动态代理学习完。Java的基础知识就算全齐活了。 首先,我们进入单元测试的学习。 一、单元测试 1.1 单元测试快速入门 所谓单元测…

北斗消防系统实现林海无信号应急通信,高效防灾救灾开拓应急救援新通道

最近,贵州多地爆发的重大山火,火势 21日这12天里,贵州发生森林火情221起,当地包括武警、消防、专业救援队伍等在内的9千多人连续扑救,1.5万名基层党员干部、民兵、群众及志愿者协助救火。目前,贵州全省火灾…

OSPF状态机+SPF算法

OSPF状态机 1.点到点网络类型 down-->init-->(前提为可以建立邻接)exstart——>exchange-->若查看邻接的DBD 目录后发现不用进行LSA 直接进入ful。若查看后需要进行查询、应答先进入loading,在查询应答完后再进入 fuIl: 2.MA网络类型 down --&g…

【计算机网络】——概述(图文并茂)

概述 一.信息时代的计算机网络二.互联网概述1.网络,互连网,互联网(因特网)1.网络2.互连网3.互联网(因特网) 2.互联网简介1.互联网发展的三个阶段2.互联网服务提供者(ISP)3.互联网的组…

HTTP/超文本传输协议(Hypertext Transfer Protocol)及HTTP协议通信步骤介绍和请求、响应阶段详解;

目录 一、HTTP/超文本传输协议 特点和功能 请求-响应模型 版本和扩展 安全性和加密 二、HTTP协议通信步骤介绍 三、请求、响应阶段详解 HTTP请求 HTTP响应 示例 一、HTTP/超文本传输协议 HTTP/超文本传输协议(Hypertext Transfer Protocol)是…

【康耐视国产案例】智能AI相机:深度解析DataMan 380大视野高速AI读码硬实力

随着读码器技术的不断更新迭代,大视野高速应用成为当前工业读码领域的关键发展方向。客户对大视野高速读码器的需求源于其能显著减少生产成本并提升工作效率。然而,大视野应用场景往往伴随着对多个条码的读取需求,这无疑增加了算法的处理负担…

cuda 11.6 pytorch安装

在安装之前,需要先配置GPU环境(安装CUDA和CudaNN) 命令行输入nvidia-smi,查看驱动信息 nvidia-smi 安装相应的CUDA 和CUDANN 验证:输入nvcc --version 或者nvcc -V 进行检查 nvcc --version nvcc -V 在anaconda里创建环境 co…

NLP课程笔记-基于transformers的自然语言处理入门

toc 项目地址 https://github.com/datawhalechina/learn-nlp-with-transformers/ 2017年,Attention Is All You Need论文(Google Brain)首次提出了Transformer模型结构并在机器翻译任务上取得了The State of the Art(SOTA, 最好)的效果。2…