MySQL学习(14):索引使用规则

news2024/11/16 3:45:49

 1. 索引语法

#创建索引
create [unique|fulltext] index 索引名 on 表名 (字段名,...);
#字段可以有多个
#如果不加unique或fulltext,那么将创建一个普通索引
#在InnoDB引擎小,创建的索引默认是B+tree结构

#查看索引
show index from 表名;

#删除索引
drop index 索引名 on 表名;

2.联合索引

2.1创建语法

为th_use表中的3个字段:profession、age、status创建联合索引:

create index idx_user_pro_age_sta on th_user(profession,age,status);

括号内3个字段的顺序是有作用的,不能随意排序。

创建完成后,可以查找到下图的结果

2.2最左前缀法则

联合索引要遵守最左前缀法则

最左前缀法则:查询从索引的最左列开始,并且不能跳过索引中间的列。如果跳过某一列,该列后面的字段的索引会失效

以下面的表tb_user为例,它有一个联合索引idx_user_pro_age_sta,创建联合索引时,3个字段的顺序从左至右为profession、age、status

(1)搜索语句包含联合索引的每个字段

虽然建立索引时要区分字段的左右顺序,但在搜索语句并不需要特别区分顺序,并列即可

(2)搜索语句缺少右列字段

语句中虽然少了status字段,但因为包含了最左列,且age是左数第二列,顺序没有打乱,所以可以对profession、age字段正常使用索引

(3)搜索语句缺少最左列字段

可以看到,一旦缺少了最左列字段profession,其他2个字段是无法使用索引的

(4)搜索语句缺少中间字段

这种情况会造成缺少列及其右边的字段无法使用索引,而缺失列左边的字段依然可以正常使用索引。

即:profession字段可以使用索引,status字段无法使用索引

2.3范围查询造成右侧列失效

联合索引中,出现范围查询(即>、<),则范围查询右侧的列字段的索引将失效。但如果使用>=、<=则不会出现这个问题。

沿用之前的表为例,下图展示的就是虽然使用了联合索引idx_user_pro_age_sta,但第三个字段status的索引失效了

如果把age>30改为age>=30,则可以避免这一情况。可以看到下图中索引使用的字节数增加了,说明status字段也使用了索引

3.索引失效的5种情况

3.1对建立了索引的字段进行运算操作,索引将失效

对字段的运算操作,最典型的就是函数运算

像下图这样的操作就会导致索引失效

3.2字符串类型的字段没加单引号,索引将失效

对于char、varchar、text这种字符串类型的字段,必须要在搜索语句中对其后的数值加上单引号,才能使用索引。

像下图中的第二个语句,由于没有加单引号,它就不会使用索引,而是进行全表扫描:

3.3模糊匹配

尾部模糊匹配不会导致索引失效,头部模糊匹配会导致索引失效。

下图中,第一条语句可以正常使用索引,第二条语句则无法使用索引:

3.4 or连接若有一边的字段索引失效,则涉及的索引都会失效

下图中第一条语句,如果id建立了索引,age没建立索引,则id的索引也会失效

3.5若mysql评估全表扫描比使用索引快,则会主动放弃使用索引

这种情况不需要人为操作什么,mysql的判断是在命令执行前自动运行的

4.SQL提示

假如一个表中的某些字段既单独添加了索引,又添加了联合索引,那么在搜索这些字段的时候,就会在2中索引之间做选择,如果不进行人为干涉,那么就全都由mysql自行判断。

但使用者也可以通过添加SQL提示,来干预mysql的选择:

(1)建议使用:use index:

explain select * from tb_user use index(idx_user_pro) where profession ='软件工程';
#当有多个索引可选择的时候,建议mysql使用联合索引idx_user_pro
#如果mysql判断使用联合索引消耗过大,那么就不会使用联合索引

(2)强制不使用:ignore index:

explain select * from tb_user ignore index(idx_user_pro) where profession='软件工程';
#当有多个索引可用时,排除idx_user_pro

(3)强制使用:force index:

explain select * from tb_user force index(idx_user_pro) where profession='软件工程’;
#强制mysql必须使用联合索引idx_user_pro

如果存在多个查询条件,对于查询字段建立索引时,建议建立联合索引,而非单列索引。


5.覆盖索引、回表查询

回表查询指的就是SQL语句使用了二级索引找主键号,再由主键号走聚集索引的过程。因为使用了2次索引,所以造成了消耗。实际操作时,要避免产生回表查询。

覆盖索引指的是,虽然SQL语句使用了二级索引,但查找的东西已经可以在二级索引内找到,不必再走聚集索引。

上图中的语句1是通过id直接走的聚集索引,不涉及回表查询

语句2虽然走了二级索引,但所搜索的目标是id号,这已经在二级索引的叶子结点中存储了,所以就不必走聚集索引了,也就是一种覆盖索引

语句3所搜索的gender字段不在二级索引的叶子结点内,只能走聚集索引,也就是发生了回表查询

所以在使用select语句时,要避免直接使用select *

6.前缀索引

当字段类型为字符串(char,varchar,text)时,有时候会存储很长的字符串,这会让索引变得很大,查询时影响查询效率。

此时可以只将字符串数据的一部分前缀建立索引,提高索引效率。

create index 索引名 on 表名(字段名(n));
#表示根据字段的前n个字符建立索引

*该使用字段的前几位建立索引

这可以根据索引的选择性来决定。选择性是指不重复的索引值和数据表的记录总数的比值。

假设现在要判断email字段的选择性,就可以通过下面的语句进行比较:

select count(distinct substring(email,1,n))/ count(*) from tb user;
#可以把n取不同的数字,如...6、7、8...等进行必交,得到的结果越接近1,选择性越好

*如果搜索到了相同前缀的数据,那么会把每一个都显示出来

7.索引创建原则

(1)针对数据量较大,查询较频繁的表建立索引。

(2)针对常作为查询条件(where)、排序(orderby)、分组(group by)操作的字段建立索引。

(3)尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。

(4)如果是字符串类型的字段,字段的长度较长,可以建立前缀索引。

(5)尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。

(6)要控制索引的数量,索引越多,维护索引结构的代价也就越大,会影响增删改的效率

(7)如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。

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

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

相关文章

折叠群控FPV穿越机技术详解

折叠群控FPV穿越机技术是一个结合了多项高端技术和飞行理念的创新系统。以下是该技术的详细解析&#xff1a; 1. 技术概述&#xff1a; - FPV穿越机&#xff1a;FPV&#xff0c;全称First Person View&#xff0c;即“第一人称视角”&#xff0c;是指通过无人机上搭载的摄像头&…

Python+Pytest+Allure+Yaml+Pymysql+Jenkins+GitLab运行原理

PythonPytestAllureYamlPymysqlJenkinsGitLab运行原理逻辑及调用关系 GitLab代码仓&#xff1a; Jenkins工作空间&#xff1a; 代码&#xff1a; 测试报告展示&#xff1a;

医疗器械上市欧美,需要什么样的网络安全相关申报文件?

医疗器械在欧美上市时&#xff0c;需要提交的网络安全相关申报文件主要包括以下几个方面&#xff0c;这些要求基于欧美地区的法律法规和监管机构的指导文件。 一、美国FDA要求 1. 网络安全管理计划 内容&#xff1a;制造商需要提交一份网络安全管理计划&#xff0c;该计划应包含…

blender顶点乱飞的问题解决

初学blender&#xff0c;编辑模式下移动某些顶点&#xff0c;不管是移动还是滑动都会出现定点乱飞的问题&#xff0c;后来才发现是开了吸附工具的原因&#xff01;&#xff01;&#xff01;&#xff01; 像下面这样&#xff0c;其实我只是在Z轴上移动&#xff0c;但是就跑的很…

经纬恒润与奇瑞汽车签订新能源项目重点供应商合作协议,共同开启合作新篇章

近日&#xff0c;2024年国家级芜湖经开区汽车零部件生态大会成功举行&#xff0c;经纬恒润受邀出席&#xff0c;与行业各伙伴齐聚经开区&#xff0c;同绘发展蓝图&#xff0c;助力经开区汽车产业高质量发展。会上&#xff0c;经纬恒润与奇瑞汽车签署合作协议&#xff0c;成为奇…

2-43 基于matlab的RBF网络自适应控制应用

基于matlab的RBF网络自适应控制应用&#xff0c;使用RBF网络逼近一级倒立摆模型中未知的非线性函数部分&#xff0c;即用RBF网络代替一级倒立摆模型中未知非线性函数部分&#xff0c;从而设计自适应控制&#xff0c;实现一级倒立摆的平衡控制。程序已调通&#xff0c;可直接运行…

卡夫卡(Kafka)框架详解:从背景到应用实践

卡夫卡&#xff08;Kafka&#xff09;框架详解&#xff1a;从背景到应用实践 引言 在大数据和分布式系统日益普及的今天&#xff0c;数据处理和消息传递成为了支撑复杂业务系统的关键基础设施。Apache Kafka&#xff0c;作为一个高性能的分布式消息队列系统&#xff0c;因其高…

qt 如何制作动态库插件

首先 首先第一点要确定我们的接口是固定的&#xff0c;也就是要确定 #ifndef RTSPPLUGIN_H #define RTSPPLUGIN_H #include "rtspplugin_global.h" typedef void (*func_callback)(uint8_t* data,int len,uint32_t ssrc,uint32_t ts,const char* ipfrom,uint16_t f…

C/C++樱花树代码

目录 写在前面 系列文章 C简介 完整代码 代码分析 写在后面 写在前面 C实现精美的樱花树&#xff0c;只需这100行代码&#xff01; 系列文章 序号目录直达链接1爱心代码https://want595.blog.csdn.net/article/details/1363606842李峋同款跳动的爱心https://want595.b…

深入理解TCP:互联网通信的基石

深入理解TCP&#xff1a;互联网通信的基石 引言TCP的普遍应用TCP连接的建立与维护三次握手&#xff08;Three-Way Handshake&#xff09;连接的可靠性与超时重传数据传输与流量控制连接的终止状态转换 TCP与UDP的对比TCP协议栈的层级结构应用层&#xff08;Application Layer&a…

24下软考初级-网络管理员100条知识点速记!

宝子们&#xff01;上半年软考已经结束一段时间了&#xff0c;准备备考下半年软考初级-网络管理员的小伙伴可以开始准备了&#xff0c;这里给大家整理了100条网管知识点汇总&#xff0c;涵盖全书90%重点&#xff0c;先把这个存下&#xff01;再慢慢看书&#xff0c;边看书边背这…

androidTest 与 Test详解

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

Server - 配置 Kubernetes 多任务流程 KubeFlow Pipeline 的开发教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/140281680 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Kubern…

错误解决 error CS0117: ‘Buffer‘ does not contain a definition for ‘BlockCopy‘

Unity 2022.3.9f1 导入 Runtime OBJ Importer 后出现&#xff1a; error CS0117: ‘Buffer’ does not contain a definition for ‘BlockCopy’ 解决办法&#xff1a; 源代码&#xff1a; int DDS_HEADER_SIZE 128; byte[] dxtBytes new byte[ddsBytes.Length - DDS_HEAD…

深度学习系列一

激活函数 sigmod 梯度消失问题&#xff1a; sigmoid函数的导数在输入值较大或较小时接近于0。在反向传播过程中&#xff0c;这些小梯度会相乘&#xff0c;导致深层网络的梯度变得非常小。结果是&#xff0c;深层网络的参数几乎不会更新&#xff0c;训练变得非常困难。这就是为…

基于flask的天气数据可视化系统1.0

基于flask的天气数据可视化系统1.0 一、效果展示二、flask简介三、图表绘制四、前端页面编写五、完整代码一、效果展示 该flask项目相对简单入门,使用了flask框架、bootstrap前端技术,数据使用的是上一篇scrapy爬取城市天气数据中爬取到的数据。 二、flask简介 Flask是一个…

在linux中,如何搭建nacos2.4.0的版本,修改nacos密码

由于最近服务器经常被攻击&#xff0c;看了一下发现是nacos版本过低&#xff0c;导致被抓了肉鸡&#xff0c;导致服务器的网端被跑满&#xff0c;选择重新搭建nacos&#xff0c;进入服务器后&#xff0c;首先确定服务器是否安装java&#xff0c;先执行java -version&#xff0c…

如何应对SQL注入攻击?

引言 在现今的网络世界中&#xff0c;安全性已成为至关重要的话题。SQL注入&#xff08;SQL Injection&#xff09;是一种常见且危险的网络攻击方式&#xff0c;攻击者通过向SQL查询中插入恶意代码来操控数据库&#xff0c;从而获取敏感信息或破坏数据。了解SQL注入的各种类型…

【数据结构】建堆算法复杂度分析及TOP-K问题

【数据结构】建堆算法复杂度分析及TOP-K问题 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;数据结构 文章目录 【数据结构】建堆算法复杂度分析及TOP-K问题前言一.复杂度分析1.1向下建堆复杂度1.2向上建堆复杂度1.3堆排序复杂度 二.TOP-K问…

C++高性能通信:了解Iceoryx与零拷贝技术的实现与应用

文章目录 0. 引言1. Iceoryx使用到的零拷贝技术1.1 零拷贝技术概述1.2 零拷贝的优势1.3 Iceoryx零拷贝的实现1.4 信息轮询与信号触发 2. Iceoryx的核心概念2.1 RouDi (iox-roudi)2.2 Runtime2.3 Publisher2.4 Subscriber2.5 Topic 3. Iceoryx使用示例3.1 发布者程序3.2 订阅者程…