Mysql-索引创建,索引失效案例

索引创建建议

1 什么情况下需要创建索引?

  1. 频繁出现在where 条件字段,order排序,group by分组字段
  2. select 频繁查询的列,考虑是否需要创建联合索引(覆盖索引,不回表)
  3. 多表join关联查询,on字段两边的字段都要创建索引

索引优化建议

  1. 表记录很少不需创建索引 :索引是要有存储的开销
  2. 一个表的索引个数不能过多:
    (1)空间:浪费空间。每个索引都是一个索引树,占据大量的磁盘空间。
    (2)时间:更新(插入/Delete/Update)变慢。需要更新所有的索引树。太多的索引也会增加优化器的选择时间。所以索引虽然能够提高查询效率,索引并不是越多越好,应该只为需要的列创建索引。
  3. 频繁更新的字段不建议作为索引:频繁更新的字段引发频繁的页分裂和页合并,性能消耗比较高。
  4. 区分度低的字段,不建议建索引:
    比如性别,男,女;比如状态。区分度太低时,会导致扫描行数过多,再加上回表查询的消耗。
    如果使用索引,比全表扫描的性能还要差。这些字段一般会用在组合索引中。姓名,手机号就非常适合建索引。
  5. 在InnoDB存储引擎中,主键索引建议使用自增的长整型,避免使用很长的字段:
  6. 主键索引树一个页节点是16K,主键字段越长,一个页可存储的数据量就会越少,比较臃肿,查询
    时尤其是区间查询时磁盘IO次数会增多。辅助索引树上叶子节点存储的数据是主键值,主键值越
    长,一个页可存储的数据量就会越少,查询时磁盘IO次数会增多,查询效率会降低。
  7. 不建议用无序的值作为索引:例如身份证、UUID。更新数据时会发生频繁的页分裂,页内数据不
    紧凑,浪费磁盘空间。
  8. 尽量创建组合索引,而不是单列索引:
    优点:
    (1)1个组合索引等同于多个索引效果,节省空间。
    (2)可以使用覆盖索引
    创建原则:组合索引应该把频繁用到的列、区分度高的值放在前面。频繁使用代表索引的利用率
    高,区分度高代表筛选粒度大,这样做可最大限度利用索引价值,缩小筛选范围

索引失效分析

CREATE TABLE `t_user_index_analyse` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`pos` varchar(10) DEFAULT NULL,
`pay_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_user_nameAgePos` (`name`,`age`,`pos`)
) ENGINE=InnoDB;
insert into t_user_index_analyse (id,name,age,pos,pay_time) values(1 ,'z3'
,22,'manager','2022-03-13 09:31:34');
insert into t_user_index_analyse (id,name,age,pos,pay_time) values(2 ,'July'
,23,'dev','2022-03-13 09:31:34');
insert into t_user_index_analyse (id,name,age,pos,pay_time) values(3 ,'2000'
,23,'dev','2022-03-13 09:31:34');

1 全局匹配
explain 相关知识
下面这两条SQL语句都是使用了组合索引

explain select * from t_user_index_analyse where name='July' and age=25 and pos='dev';
#这个SQL优化器会优化顺序以使用上索引,但是我们最好还是按照顺序来写
explain select * from t_user_index_analyse where  name = 'July';
explain select * from t_user_index_analyse where name='July' and age=25;

第一条SQL语句:
我们可以看到使用了组合索引,key_len是806(最左匹配),ref有三个引用,过滤掉的数据占数据的百分比,比如值为100%,就是没有查到数据。
在这里插入图片描述
第二条SQL语句
可以使用了组合索引的一部分,key_len是768(最左匹配),ref中也只是引用了一个字段。
在这里插入图片描述
第三条语句:
引用了组合索引的两个字段key_len是773
在这里插入图片描述

2 最左法则

#可以使用到索引
explain select * from t_user_index_analyse where name='July';
explain select * from t_user_index_analyse where name='July' and age=25;
#无法使用索引
explain select * from t_user_index_analyse where age=23 and pos='dev'; #没有最左字段
explain select * from t_user_index_analyse where pos='dev'; #没有最左字段
#根据最左匹配使用到了组合索引的一部分
explain select * from t_user_index_analyse where name='July' and pos='dev'; #age字段间断只能使用到一部分

前两条SQL语句:
在这里插入图片描述

无法使用索引SQL语句:
在这里插入图片描述
使用到了组合索引的一部分:
在这里插入图片描述
总结:我们使用组合索引的时候要遵循最左匹配原则,组合索引最左的索引如果没有则使用不到索引,如果有最左字段,但是中间字段没有,那么这个时候只会应用最左的字段。
比如(a,b,c) 如果要使用这个索引 a必然不能少, 如果你条件里面是ac,b被跳过了,那么这个时候也只能使用到a,这个与组合索引的存贮有关。因为组合索引是先看a的顺序,在b,c如果都一样看主键的顺序。如果没有最左字段或中间跳字段了这个比较无法进行。

3 不能再索引上做计算

#这个肯定是走不了索引的,因为你的值是动态计算的不知道要从何查起
explain select * from t_user_index_analyse where left(name,4)='July';

在这里插入图片描述
4 范围条件右边的列不会走索引

explain select * from t_user_index_analyse where name='July' and age>25 and pos='manager';

可以看到走了最左索引name和age这两个字段是可以走组合索引的,age是查询的范围不是等值比较后面的pos就走不了索引了,但是这里可以索引下推,就是后面这个条件可以直接在查询的时候利用起来做一进一步筛选,可以减少服务端筛选的工作量。
在这里插入图片描述
5 使用覆盖索引

explain select * from t_user_index_analyse where name='July' and age=25 and pos='manager';
explain select name,age,pos from t_user_index_analyse where name='July' and age=25 and pos='manager';

第一条SQL语句:
在这里插入图片描述
第二条语句:

在这里插入图片描述
对比发现explain的结果有所不同,是因为第二条SQL语句组合索引已经存放了所有字段的信息,不用进行回表查询,这就是覆盖索引。

6 索引字段上不要使用不等

# 索引字段上使用(!= 或者 < >)判断时,会导致索引失效而转向全表扫描
explain select * from t_user_index_analyse where name != 'July';
explain select * from t_user_index_analyse where name <> 'July';

在这里插入图片描述
很容易理解,不等判断根本无法知道,我下一步应该怎么走,比如我来到树的根节点对比不等这个时候我应该向那条指针走呢?大于这个字符串,小于这个字符串都可能和这个字符串不等,所以没办法在树上进行寻找。
7 索引字段上不使用null

# 索引字段上使用 is not null 判断时,会导致索引失效而转向全表扫描
explain select * from t_user_index_analyse where name is not null;

在这里插入图片描述
8 索引字段使用like不以通配符开头

# 索引字段使用like以通配符开头(‘%字符串’)时,会导致索引失效而转向全表扫描
explain select * from t_user_index_analyse where name like '%July%';
explain select * from t_user_index_analyse where name like '%July';
#这条语句是可以走索引的
explain select * from t_user_index_analyse where name like 'July%';

前两条语句:
在这里插入图片描述

最后一条语句,因为最左匹配,所以左边的信息可以利用
在这里插入图片描述
9 索引字段字符串要加单引号

# 索引字段是字符串,但查询时不加单引号,会导致索引失效而转向全表扫描
explain select * from t_user_index_analyse where name = '2000';
explain select * from t_user_index_analyse where name = 2000;

10 索引字段不要使用or

# 索引字段使用 or 时,会导致索引失效而转向全表扫描
explain select * from t_user_index_analyse where name = 'July' or name='z3';

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

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

相关文章

【PyRestTest】高级使用

本节主要涉及PyRestTest的高级特征的详细使用,主要指:generators(生成器), variable binding(变量绑定), data extraction(数据提取), content validators(文本验证) 它们是如何组合在一起的? 模板和上下文 测试和基准测试可以使用变量来模板化动态配置。使用基础的…

OSPF排错

目录 实验拓扑图 实验要求 实验排错 故障一 故障现象 故障分析 故障解决 故障二 故障现象 故障分析 故障解决 故障三 故障现象 故障分析 故障解决 故障四 故障现象 故障分析 故障解决 故障五 故障现象 故障分析 故障解决 故障六 故障现象 故障分析 …

区块链游戏解说:什么是 SecondLive

数据源&#xff1a;SecondLive Dashboard 作者&#xff1a;lesleyfootprint.network 什么是 SecondLive SecondLive 是元宇宙居民的中心枢纽&#xff0c;拥有超过100 万用户的蓬勃社区。它的主要使命是促进自我表达&#xff0c;释放创造力&#xff0c;构建梦想中的平行宇宙…

【HTML】自定义属性(data)

自定义属性 data: 的用法&#xff08;如何设置,如何获取) &#xff0c;有何优势&#xff1f; data-* 的值的获取和设置&#xff0c;2种方法: 传统方法 getAttribute() 获取 data- 属性值; setAttribute() 设置 data- 属性值getAttribute() 获取 data- 属性值; setAttribute()…

腾讯云SSL证书在阿里云添加域名DNS解析

场景说明 在阿里云申请并备案了域名&#xff0c;这个域名理论上可以在任何服务器上进行绑定。应用服务器部署到腾讯云&#xff0c;并在腾讯云申请了SSL证书&#xff0c;从而完成HTTPS转化。那么问题来了&#xff0c;腾讯提供的免费版SSL证书是一年有效期&#xff0c;到期后就需…

Cadence——布线部分相关教程

&#xff08;一&#xff09;PCB布线叠层与阻抗设计 PCB布线要区分有阻抗和无阻抗这个是根据频率和速率来区分&#xff0c;一般达100M以上就是有阻抗&#xff0c;单端信号一般是五十欧姆&#xff0c;差分信号一般一百欧姆 叠成是多层板由不同的介质压合而成&#xff0c;介质是&…

SD-WAN技术:网络升级的智慧选择

在移动办公、云计算技术和多元化的应用交付方式不断普及的今天&#xff0c;企业网络正变得越来越错综复杂&#xff0c;充满了不可预测性。为了跟上这一网络发展的步伐&#xff0c;IT部门需要深刻反思网络建设的方式&#xff0c;而定义软件广域网&#xff08;SD-WAN&#xff09;…

Ubuntu系统硬盘分区攻略(磁盘分区、RAID磁盘阵列、RAID阵列、固态硬盘分区、机械硬盘分区、swap分区、swap交换分区)

文章目录 分区需求分区方案分区顺序相关疑问swap分区不是应该放在最后吗&#xff1f;我安装系统分区的时候&#xff0c;上面有available devices&#xff0c;下面有create software raid(md)&#xff0c;我该用哪个&#xff1f;我available devices下面有个893G的固态&#xff…

C++数据结构与算法——链表

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

推特账号被冻结怎么办?检查IP是否正常

Twitter 拥有庞大的用户群和日常内容流&#xff0c;是沟通、网络和营销的重要平台。然而&#xff0c;处理其限制和潜在的帐户问题可能很棘手。有许多跨境社媒小伙伴反馈&#xff0c;账号无故被冻结&#xff0c;导致内容与客户尽失&#xff01;其实除了账户养号、被举报、广告信…

重磅!讯飞星火V3.5发布,携手35万生态开发者,赋能千行百业

今天的通用人工智能必将像PC和互联网的诞生一样&#xff0c;深刻改变人类生产生活方式。2023年&#xff0c;大模型的基础研究和应用风起云涌。2024年&#xff0c;国内大模型距国际顶尖技术追平了多少&#xff1f;大模型在哪些领域产生了效益&#xff1f; 1月30日&#xff0c;讯…

前端工程\模块化

前端工程\模块化&#x1f3ed; 本篇文章&#xff0c;学习记录于&#xff1a;尚硅谷&#x1f3a2;&#xff0c;紧接前文&#xff1a;邂逅Node.JS的那一夜→博客 无论是前端、后端、甚至非编程领域都有模块化的概念&#xff0c;只是不同的领域叫法不同&#xff0c;不过&#xf…

【WPF.NET开发】优化性能:图形呈现层

本文内容 图形硬件呈现层定义其他资源 呈现层为运行 WPF 应用程序的设备定义图形硬件功能和性能级别。 1、图形硬件 对呈现层级别影响最大的图形硬件功能包括&#xff1a; 视频 RAM - 图形硬件中的视频内存量决定了可用于合成图形的缓冲区大小和数量。 像素着色器 - 像素着…

【升级openssl1.1.1t报错libssl.so.1.1: cannot open shared object file】

升级openssl报错&#xff1a; openssl vesion openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory 编译安装openssl1.1.1t当执行openssl version的时候&#xff0c;报上述错误&#xff0c;将编译到的…

OCP NVME SSD规范解读-8.SMART日志要求-4

SMART-21&#xff1a;这段描述解释了一个与设备内部I/O操作非对齐相关的计数器功能。该计数器记录的是由NVMe SSD执行的、起始地址未按照设备内部间接寻址单元&#xff08;IU&#xff0c;Indirection Unit&#xff09;大小进行对齐的写入I/O操作数量。 “Alignment”指的是每次…

2014年苏州大学837复试机试C/C++

2014年苏州大学复试机试 要求 要求用C/C编程&#xff1b;对程序中必要的地方进行注释。上机规则 请在电脑桌面上新建一个文件夹文件夹名为考试姓名&#xff08;中文&#xff09;&#xff1b;考试完毕后&#xff0c;将所编写的文件放在上述文件中。 第一题&#xff08;20分&…

使用ffmpeg madiamtx制作一个rtsp源

有很多人在跑rtsp解码的demo的时候, 苦于找不到一个可以拉流的源, 这里说一个简单的方法. 使用mediamtx, 加ffmpeg加mp4文件方式, 模拟一个rtsp的源. 基本架构就是这样. 在PC上, 这里说的PC可以是远程的服务器, 也可以是你的开发用的windows, 都行. 把mediamtx, 在pc上跑起来 …

如何有效避免市场恐慌性抛售?

布雷特斯坦伯格是一位备受尊敬的交易心理导师&#xff0c;曾担任华尔街多家顶级培训机构的心理导师&#xff0c;指导交易员们如何应对心理挑战。作为一名心理学教授和资深交易员&#xff0c;他对交易心理的理解远超常人。人们普遍认为&#xff0c;要想在交易领域取得成功&#…

BUUCTF-Real-[PHP]XXE

目录 1、原理 2、XXE漏洞产生的原因 3、开始复现 paylaod 复现 4、flag 1、原理 XML数据在传输过程中&#xff0c;攻击者强制XML解析器去访问攻击者指定的资源内容&#xff08;本地/远程&#xff09;&#xff0c;外部实体声明关键字SYSTEM会令XML解析器读取数据&#xf…

基于SpringBoot的高校社团管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是何时&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML 我欲乘风归去 又恐琼楼玉宇 高处不胜寒 -苏轼 目录 一、项目简介 二、开发技术与环境配置 2.1 SpringBoot框架 2…