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值时,能够更好的确定使用哪个索引性能更好。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

曾巩,散文的艺术与哲思

曾巩,字子固,世称南丰先生,南丰(今江西)人,生于北宋真宗天禧三年(公元1019年),卒于北宋元丰六年(公元1083年),享年64岁。他是中国北宋…

Unity开发——编辑器打包、3种方式加载AssetBundle资源

一、创建ab资源 (一)Unity资源设置ab格式 1、选中要打包成assetbundle的资源; 可以是图片,材质球,预制体等,这里方便展示用预制体打包设置展示; 2、AssetBundle面板说明 (1&…

【React篇】组件错误边界处理(组件错误引起的页面白屏)

我们知道在生产环境react错误会导致整个页面崩溃,显示为空白页面。 比如下图的错误,导致了左侧页面直接白屏: 由于某一个组件报错导致整个页面崩溃是很严重的问题,那么我们应该如何去降低代码报错带来的影响呢? 我们…

JavaScript 动态网页实例 —— 窗口控制

除了打开和关闭窗口之外,还有很多其他控制窗口的方法。例如,可以使用 window.focus()方法使窗口获得焦点,也可以利用与其相对的window.blur 方法使窗口失去焦点。本节介绍移动窗口、改变窗口大小、窗口滚动、窗口超时操作、常用窗口事件、常用窗口扩展等窗口控制的方法和手段。…

mac电脑鼠标键盘共享软件:ShareMouse for Mac 激活版

ShareMouse 是一款跨平台的键盘和鼠标共享软件,它允许用户在多台计算机之间共享同一组键盘和鼠标,实现无缝的操作和控制。该软件适用于 Windows 和 macOS 系统,并且支持多种连接方式,包括局域网连接和无线连接。 使用 ShareMouse&…

从openstack环境中将服务器镜像导出的简单办法

1 登录openstack的页面,找到计划导出的主机信息。 通过实例名称, IP地址,找到对应的记录。点击实例名称,进入详情页。 在这里主要可以知道,当前主机在服务器上的文件ID,可以按这个ID去找对应的目录。 还可…

java读取文件内容(正则表达式匹配)

已知文件score.txt内容如下: 语文85分,数学89分,英语75分,马列95分。 要求解析出其中的成绩数据,并计算总成绩 import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import jav…

JDK环境配置、安装

DK环境配置(备注:分32位与64位JDK,32位电脑只能按照32位JDK,64位电脑兼容32、64位JDK) 一、检查自己电脑是否安装过JDK 1.在电脑屏幕左下角,输入命令提示符CMD,打开命令提示符应用 2.在打开界…

QT系列教程(7) QLineEdit介绍

简介 QLineEdit属于输入插件,用来实现单行录入。支持几种录入模式。 Normal表示正常录入,录入的信息会显示在QLineEdit上。 Password表示密码录入的方式,录入的信息不显示QLineEdit,只是通过黑色圆点显示。 NoEcho 表示不显示录入信息&am…

“开源与闭源:AI大模型发展的未来之路“

文章目录 每日一句正能量前言数据隐私开源大模型与数据隐私闭源大模型与数据隐私数据隐私保护的共同考虑结论 商业应用开源大模型的商业应用优势:开源大模型的商业应用劣势:闭源大模型的商业应用优势:闭源大模型的商业应用劣势:商…

ros DWA局部规划模块

ROS-DWA模块 主要流程DWAPlannerROS::computeVelocityCommandsDWAPlannerROS::dwaComputeVelocityCommandsDWAPlanner::findBestPathSimpleScoredSamplingPlanner::findBestTrajectory 调参技巧DWA被目标点过度吸引,且不听全局规划器指挥 消融实验goal_front_costs_…

Java 异步编编程——Java内置线程池(Executor 线程池)

文章目录 知道线程池是什么以及解决什么问题Java 内置线程池Java 内置线程池设计结构及执行机制ThreadPoolExecutor 中的概念生命周期核心参数阻塞队列4 种任务拒绝策略 线程池使用场景 知道线程池是什么以及解决什么问题 线程池(Thread Pool)是一种基于…

Kafka Java API

1、增加依赖 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>1.0.0</version> </dependency>2、三个案例 案例1&#xff1a;生产数据 import org.apache.kafka.clients.p…

SpringBoot HelloWorld 之 实现注册功能

SpringBoot HelloWorld 之 实现注册功能 一.配置 创建数据库big_event CREATE TABLE user (id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ID,username varchar(20) COLLATE utf8_unicode_ci NOT NULL COMMENT 用户名,password varchar(32) COLLATE utf8_unicode_ci …

β-烟酰胺单核苷酸(NMN)功能不断得到验证 市场规模呈增长态势

β-烟酰胺单核苷酸&#xff08;NMN&#xff09;功能不断得到验证 市场规模呈增长态势 β-烟酰胺单核苷酸&#xff08;β-Nicotinamide mononucleotide&#xff0c;NMN&#xff09;是一种生物活性分子&#xff0c;是一种辅酶Ⅰ&#xff08;NAD&#xff09;的前体&#xff0c;也是…

WPF Binding对象

在WinForm中&#xff0c;我们要想对控件赋值&#xff0c;需要在后台代码中拿到控件对象进行操作&#xff0c;这种赋值形式&#xff0c;从根本上是无法实现界面与逻辑分离的。 在WPF中&#xff0c;微软引入了Binding对象&#xff0c;通过Binding&#xff0c;我们可以直接将控件与…

NTFS磁盘格式读写工具:Tuxera NTFS 2021 for Mac

Tuxera NTFS 是一款用于 macOS 系统的 NTFS 文件系统驱动程序。NTFS 是 Windows 系统中常用的文件系统&#xff0c;而 macOS 默认只支持读取 NTFS 格式的磁盘&#xff0c;不能进行写入操作。因此&#xff0c;如果你需要在 macOS 上进行 NTFS 磁盘的写入操作&#xff0c;就需要安…

php使用openssl返回false报错0308010C

本地php使用openssl返回false, 但是在服务器上测试正常openssl_encrypt($jsonStr, DES-ECB, $key, OPENSSL_RAW_DATA, ); 查看错误 openssl_error_string(); error:0308010C:digital envelope routines::unsupported 原因是: 服务器上的openssl是1.1版本, 本地是3.0版本 通…

真北5月小结|物事人心向上

1、跑步 今年的计划是每月跑15小时。五月实际跑了13小时17分。一到五月共跑了74小时43分&#xff0c;所以按平均每月15小时&#xff0c;还欠17分&#xff0c;六月补上。 另外两个跑步的标准是&#xff1a;保持跑步三天可见&#xff0c;最近龙舟雨&#xff0c;对这一条干扰很大&…

iframe内嵌网页自适应缩放 以展示源网页的比例尺寸

需求:这是我最近开发的低代码平台遇到的需求 ,要求将配置好的应用在弹框中预览(将预览网页内嵌入弹框中) 但是内嵌进入后 他会截取一部分(我源网站网页尺寸 是1980x1080 或者 3060X2160等等) 但是我这个dialog弹框只有我自定义的1000多px的宽高 他只会展示我iframe网页的一部分…