MySQL原理(四)索引(3)索引失效与索引区分度

一、索引失效:

首先未使用索引列作为查询条件索引是肯定会生效的,还有其他的情况,索引列做为了查询条件也失效了:

 ALTER TABLE staffs ADD INDEX idx_staffs_nameAgePos(NAME, age, pos);

1、select 语句、order by语句:和索引无关;

2、where语句索引失效:

(1)组合索引失效:如果索引了多列,要遵守最左前缀法则,Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但必须包含最左侧的一个。例如索引是index (a,b,c),可以支持a | a,b| a,b,c |a,c这几种组合进行查找,但不支持 b|b,c|c进行查找 。如

注:

组合索引最好全值匹配(查询条件的顺序和索引的顺序一致,这种方式最好,能够充分发挥索引的作用,当然使用and连接的查询提交也可以不与索引的顺序一致,mysql会自动优化,如index(a,b,c),where a= and b= and c= 与where b= and c= and a=,...效果是一样的 

(2)列类型是字符串,查询条件未加引号;

(3)使用like时通配符在前会导致索引失效,通配符在后面时效率不受影响,所以一般使用右模糊:

(4)查询条件中使用or会使索引失效,要想是索引生效,需要将or中的每个列都加上索引;

(5)对索引列进行计算、函数、(自动or手动)类型转换会导致索引失效,如where substr(a, 1, 3) = ‘hhh’、where a = a+1、DATE_FORMAT函数等;

注意:索引失效指的是where条件不当引起的失效,如这里计算放在select后面是不会引起索引失效的。

(6)mysql 在使用不等于(!= )的时候无法使用索引,会导致全表扫描;

(7)使用in查询,当in()括号里面只有一个时,索引有效;否则无效。如表zt_test现有数据和索引如下:

 现在查询:

当in的条件多于1个时,

小结:假设index(a,b,c):

sql有没有用到索引,有的话用到了哪些
where c=1 and b=1 and a='aaa'  用到了a,b,c
where a = 'aaa'  and c=1 用到了a,没有用到c
where a like '%aaa%' and b=1 and c=1  没有用到
where a like 'aaa%' and b=1 and c=1 用到
where a ='aaa' and b like '1%' and c=1用到了a和b, c在模糊查询的通配符之后,断了
where a = 111 and b =1 and c=1 没有用到
where a = 'aaa' or b =1 or c=1   没有用到
where a!='aaa' and b =1 and c=1 没有用到
where (a+'aa')!='aaa'  没有用到
ORDER BY a  没有用到
GROUP  BY a 用到

二、索引长度与索引区分度

在SQL执行计划中,key_len 表示索引长度,经常用于判断复合索引是否被完全使用。

注:在utf8编码方式下,一个字符占3个字节;utf8mb4一个字符占4个字节;gbk中一个字符占2个字节;latin中一个字符占1个字节。索引长度可以指定,不指定的情况下会按照规则使用默认的长度。

1、默认索引长度定义:

在没有指定索引长度的情况下,如果索引字段不为空且长度不可变,索引长度等于该字段的长度;可以为null,mysql会用1个字节标识;长度可变,MySQL会使用2个字节标识。以utf8编码为例

(1)如果索引字段不为空且长度不可变,索引长度等于该字段的长度;

CREATE TABLE `test` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` char(20) NOT NULL,PRIMARY KEY (`id`),KEY `index_name` (`name`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

随便插入几条数据:

    

 索引查询: key_len = 60,索引段name的长度是20个字符,key_len = 20*3 = 60。

   

(2)如果索引字段不为空,长度可变:改成varchar:

   

查询:key_len = 20*3 +2= 62

(3)如果索引字段可以为空,长度不可变:

    

  查询:key_len = 20*3 +1= 61

  

(4)以此类推,字段既可以为空长度也可变,索引长度+2+1:

   

查询:

  

(5)复合索引:索引列长度之和

CREATE TABLE `test` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,`address` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`),KEY `index_name_address` (`name`,`address`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

   

 key_len长度为63,说明只用到了复合索引的前半部分;

 key_len长度为126,说明该SQL查询语句用了整个复合索引。

 综上,key_len 表示索引长度,经常用于判断复合索引是否被完全使用。

2、指定索引长度:
CREATE INDEX index_name ON table_name column_name(length);

 如对于表

 设置索引长度:

ALTER TABLE test ADD INDEX index_name_address (`name`(10),`address`(10));

 

 key_len = 10*3+2+1+10*3+2+1=66。

3、索引区分度:

区分度百分比 = select count(distinct left(索引字段,索引长度))/count(1) from table。区分度越高,查询越快,如主键索引,主键是唯一的,主键索引的区分度就是1。区分度低的索引原则上已失去意义,没有明显的查询效率,而且添加了索引每次查询会先走索引树,再回表查询,增加了额外的io消耗,就不如直接查询原表来的效率高

4、总结:

索引长度和区分度是相互矛盾的,索引长度太短,那么区分度就很低,把索引长度加长,区分度就高,但是索引也是要占内存的,所以我们需要找到一个平衡点。

举个例子:(张,张三,张三哥),如果索引长度取1的话,那么每一行的索引都是 张 这个字,完全没有区分度,无法排序,结果这样三行完全是随机排的,因为索引都一样;如果长度取2,那么排序的时候至少前两个是排对了的,如果取3,区分度达到100%,排序完全正确;但是并不是索引越长越好,比如 (张,李,王) 和 (张三啦啦啦,张三呵呵呵,张三呼呼呼);前者在内存中排序占得空间少,排序也快,后者明显更慢更占内存,在大数据应用中这一点点影响都是很大的。

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

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

相关文章

来了来了,5000个红包封面免费领

今年公众号很慷慨,给长期运营的作者免费发放了6w个红包封面,感谢公众号平台。 往年还是自己花钱找别人设计,平台审核通过后才能正常发放给大家,自从AI绘画工具问世后,自己也能设计了。 下面的两个封面都是我用AI工具St…

2024.1.30报错记录

今天想调通一套github上的U-net代码,把报错记录一下 第一章 ModuleNotFoundError: No module named skimage 没有这个模块 pip install scikit-image 第二章 TypeError: (‘Keyword argument not understood:‘, ‘input‘) TypeError: (‘Keyword argument …

从 20 多套 MySQL 到 1 套 TiDB丨骏伯网络综合运营管理平台应用实践

原文来源: https://tidb.net/blog/a38c72a4 本文作者:骏伯网络 唐帆,PingCAP 贺美存 骏伯网络简介 广州骏伯网络是一家以数据驱动的科技公司,聚焦移动互联网营销服务,坚持以客户为中心,深耕 APP、运营…

政安晨:示例演绎Python的列表

列表和你可以用它们做的事:包括索引、切片和对象变动 (变异-Mutation) 。 列表 在Python中,列表表示有序的值序列。以下是如何创建列表的示例: primes [2, 3, 5, 7] 我们可以将其他类型的元素放在列表中: planets [Mercury…

【C++】拷贝构造函数和赋值运算符重载详解

目录 拷贝构造函数 概念 特征 赋值运算符重载 运算符重载 赋值运算符重载 ​编辑前置和后置重载 ⭐拷贝构造函数 ⭐概念 拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存 在的类类型对象创建新…

【Java程序设计】【C00248】基于Springboot的摄影跟拍预定管理系统(有论文)

基于Springboot的摄影跟拍预定管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的摄影跟拍预定管理系统 本系统分为系统功能模块、管理员功能模块、摄影师功能模块以及用户功能模块。 系统功能模块&#xf…

回归预测 | Matlab实现CPO-CNN-LSTM-Attention冠豪猪优化卷积长短期记忆神经网络注意力机制多变量回归预测(SE注意力机制)

回归预测 | Matlab实现CPO-CNN-LSTM-Attention冠豪猪优化卷积长短期记忆神经网络注意力机制多变量回归预测(SE注意力机制) 目录 回归预测 | Matlab实现CPO-CNN-LSTM-Attention冠豪猪优化卷积长短期记忆神经网络注意力机制多变量回归预测(SE注…

【考研408】操作系统笔记

文章目录 [toc] 计算机系统概述操作系统的基本概念操作系统的概念和特征操作系统的目标和功能(**处理器管理、存储器管理、设备管理、文件管理、向用户提供接口、扩充机器**) 操作系统的发展与分类操作系统的运行环境操作系统的运行机制 操作系统的体系结…

Python(SQLite)executescript用法

SQLite 数据库模块的游标对象还包含了一个 executescript() 方法,这不是一个标准的 API 方法,这意味着在其他数据库 API 模块中可能没有这个方法。但是这个方法却很实用,它可以执行一段 SQL 脚本。 例如,如下程序使用 executescr…

CVEMap:用于查询、浏览和搜索 CVE 的开源工具

CVEMap 是一个开源命令行界面 (CLI) 工具,可让您探索常见漏洞和暴露 (CVE)。它旨在提供一个简化且用户友好的界面来导航漏洞数据库。 尽管 CVE 对于查明和讨论安全漏洞至关重要,但它们的快速增长和偶尔夸大的严重性往往会导致误导性信息。 安全专家必须…

(bean配置类的注解开发)学习Spring的第十三天

bean配置类的注解开发 问题提出 用类充当配置文件 applicationcontext.xml : Configuration注解标识此类为配置类,替代原有xml文件 看原配置文件applicationcontext.xml代码 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http:/…

EasyCVR视频融合平台如何助力执法记录仪高效使用

旭帆科技的EasyCVR平台可接入的设备除了常见的智能分析网关与摄像头以外 &#xff0c;还可通过GB28181协议接入执法记录仪&#xff0c;实现对执法过程的全称监控与录像&#xff0c;并对执法轨迹与路径进行调阅回看。那么&#xff0c;如何做到执法记录仪高效使用呢&#xff1f; …

MMDB是什么

MMDB (MaxMind DB) 是一种专为地理位置服务和其他网络相关数据设计的二进制文件格式。这种格式主要被用于存储如 IP 地址定位数据之类的信息&#xff0c;使得应用程序可以快速且高效地查询 IP 地址的地理位置、自治系统信息、网络提供商信息等。MMDB 格式由 MaxMind 公司开发&a…

react 使用react-seamless-scroll实现无缝滚动

文章目录 1. 实现无缝滚动效果2. react-seamless-scroll 无缝滚动案例介绍3. react 项目集成3.1 项目引入 cssSeamlessScroll 滚动组件3.2 完整代码3.2.1 newBet.tsx 代码3.2.2 index.module.scss 1. 实现无缝滚动效果 实现单步向下滚动点击更多展开&#xff0c;收起&#xff0…

Quartus IP学习之ISSP(In-System Sources Probes)

一、ISSP IP概要&#xff1a; ISSP&#xff1a;In-System Sources & Probes Intel FPGA IP 作用&#xff1a; 分为In-System Sources与In-System Probesn-System Sources&#xff0c;输入端&#xff0c;等价于拨码开关&#xff0c;通过输入板载FPGA上的拨码开关状态改变…

Unity DOTS中的baking(三)过滤baking的输出

Unity DOTS中的baking&#xff08;三&#xff09;过滤baking的输出 默认情况下&#xff0c;在conversation world&#xff08;baker和baking system运行的环境&#xff09;下产生的所有entities和components&#xff0c;都会作为baking环节的输出。在baking结束时&#xff0c;U…

Android学习之路(29) Gradle初探

前言: 大家回想一下自己第一次接触Gradle是什么时候&#xff1f; 相信大家也都是和我一样&#xff0c;在我们打开第一个AS项目的时候&#xff0c; 发现有很多带gradle字样的文件&#xff1a;setting.gradle, build.gradle,gradle.warpper,以及在gradle文件中各种配置&#xff…

将给定的二维数组旋转90度numpy.rot90()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将给定的二维数组旋转90度 numpy.rot90() [太阳]选择题 以下说法中正确的是? import numpy as np a np.array([[1,1,1],[2,2,2],[3,3,3]]) print("【显示】a:\n",a) print("…

MIT 6.5830 概述

简介 同MIT6.824系列类似&#xff0c;6.4830是关于Database System的一门课程&#xff0c;官方主页链接。 从课程信息可知&#xff0c;理论课分为 21 个课时&#xff0c;3个问题集&#xff0c;4个实验&#xff0c;1个项目。课程的 ppt 可以下载&#xff0c;对应的课堂回放可以…

H5 加密(MD5 Base64 sha1)

1. 说明 很多的时候是避免不了注册登录这一关的&#xff0c;但是一般的注册是没有任何的难度的&#xff0c;无非就是一些简单的获取用户输入的数据&#xff0c;然后进行简单的校验以后调用接口&#xff0c;将数据发送到后端&#xff0c;完成一个简单的注册的流程&#xff0c;那…