MySQL数据库索引及失效场景

文章目录

  • 1. MySQL索引概述
    • 1.1 索引的概念
    • 1.2 索引的特点
    • 1.3 索引的分类
    • 1.4 索引的使用场景
  • 2. 索引失效场景
    • 2.1 索引失效9种场景
    • 2.2 索引失效场景总结
  • 3. 索引失效验证
    • 3.1 全值匹配
    • 3.2 最佳左前缀
    • 3.3 索引计算
    • 3.4 索引范围:索引列上不能有范围查询
    • 3.5 索引覆盖:尽量使用覆盖索引
    • 3.6 不等: 使用不等于(!= 或者 <>)的时候
    • 3.7 null:字段的is not null 与is null
    • 3.8 like:like的前后模糊匹配
    • 3.9 or:减少使用or

1. MySQL索引概述

1.1 索引的概念

什么是索引,索引就是排好序的快速查找数据结构。

1.2 索引的特点

索引的优点
1.提高数据检索的效率, 降低数据库的IO成本。

2.通过索引列对数据进行排序, 降低数据排序的成本, 降低了CPU的消耗。

索引的缺点
1.虽然索引大大提高了查询速度, 同时却会降低更新表的速度, 如对表进行INSERT、 UPDATE和DELETE。 因为更新表时, MySQL不仅要保存数据, 还要保存一下索引文件每次更新添加了索引列的字段, 都会调整因为更新所带来的键值变化后的索引信息。

2.实际上索引也是一张表, 该表保存了主键与索引字段, 并指向实体表的记录, 所以索引列也是要占用空间的。

1.3 索引的分类

MySQL 使用的是 Btree 索引。另外还有B+tree 索引,B-tree 索引,具体原理不在细说,原理详情参考官网。
简单说下以下几个常用索引。

单值索引
概念:即一个索引只包含单个列, 一个表可以有多个单列索引

唯一索引
概念: 索引列的值必须唯一, 但允许有空值

主键索引
概念: 设定为主键后数据库会自动建立索引, innodb为聚簇索引。

复合索引
概念: 即一个索引包含多个列

1.4 索引的使用场景

适合创建索引的情况
1.主键自动建立唯一索引;
2.频繁作为查询条件的字段应该创建索引
3.查询中与其它表关联的字段, 外键关系建立索引
4.单键/组合索引的选择问题, 组合索引性价比更高
5.查询中排序的字段, 排序字段若通过索引去访问将大大提高排序速度
6.查询中统计或者分组字段

不适合创建索引的情况
1.表记录太少
2.经常增删改的表或者字段
3.Where 条件里用不到的字段不创建索引
4.过滤性不好的不适合建索引

2. 索引失效场景

2.1 索引失效9种场景

1.全值匹配:查询条件的列与索引列的字段,顺序完全相同。
2. 最佳左前缀:查询条件的列与索引列的字段相同,顺序不同,从不同顺序列开始后边都不走索引。
3. 索引计算:不要在索引上做任何计算
4. 索引范围:索引列上不能有范围查询,比如大于,小于,大于等于,小于等于。
5. 索引覆盖:尽量使用覆盖索引
6. 不等: 使用不等于(!= 或者 <>)的时候
7. null:字段的is not null 与is null
8. like:like的前后模糊匹配
9. or:减少使用or

2.2 索引失效场景总结

全值匹配,左前缀。
索引计算范围要覆盖。
不等于(!= 或者 <>)扫全表,null走索引,not不走。
like模后不模前,见or就走union all

3. 索引失效验证

索引测试环境
1.mysql版本:5.7.27-log,查询语句:select VERSION();
2.建表语句及数据:mysql批量插入数据

3.1 全值匹配

-- 全值匹配
-- 查看sql执行计划
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.age=30;
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.age=30 and deptid=4;
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.age=30 and deptid=4 AND emp.name = 'abcd';-- 创建联合索引
CREATE INDEX idx_age_deptid_name ON emp(age,deptid,NAME);

创建索引前
在这里插入图片描述
创建索引后
在这里插入图片描述

3.2 最佳左前缀

-- 创建索引
CREATE INDEX idx_age_deptid_name ON emp(age,deptid,NAME);
-- 缺少联合索引的第一个字段
explain select sql_no_cache * from emp where deptId = 4 and name = 'abcd';
-- 联合索引的第一二个字段,缺少最后一个字段
explain select sql_no_cache * from emp where age = 30 and deptId = 4;
-- 联合索引的第一三各字段,缺少第二个字段
explain select sql_no_cache * from emp where age = 30 and name = 'abcd' ;

在这里插入图片描述查询字段与索引字段顺序的不同会导致, 索引无法充分使用, 甚至索引失效!
原因: 使用复合索引, 需要遵循最佳左前缀法则, 即如果索引了多列, 要遵守最左前缀法则。 指的是查询从索引的最左前列开始并且不跳过索引中的列。
结论: 过滤条件要使用索引必须按照索引建立时的顺序, 依次满足, 一旦跳过某个字段, 索引后面的字段都无法被使用

3.3 索引计算

不要在索引上做任何计算!
不在索引列上做任何操作(计算、 函数、 (自动 or 手动)类型转换), 会导致索引失效而转向全表扫描。

1.在查询列上使用函数

-- 索引不带计算
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age=30;
-- 索引字段计算
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE LEFT(age,3)=30;

在这里插入图片描述
\2. 在查询列上做了转换

-- 创建单值索引,字符串类型 name
create index idx_name on emp(name);
-- 字符串加单引号情况
explain select sql_no_cache * from emp where name='30000';
-- 字符串不加单引号, 则会在 name 列上做一次转换!
explain select sql_no_cache * from emp where name=30000;

在这里插入图片描述

3.4 索引范围:索引列上不能有范围查询

explain SELECT SQL_NO_CACHE * FROM emp WHERE emp.age=30 and deptid=5 AND emp.name = 'abcd';
explain SELECT SQL_NO_CACHE * FROM emp WHERE emp.age=30 and deptid<=5 AND emp.name = 'abcd';

在这里插入图片描述建议: 将可能做范围查询的字段的索引顺序放在最后

3.5 索引覆盖:尽量使用覆盖索引

explain SELECT SQL_NO_CACHE * FROM emp WHERE emp.age=30 and deptId=4 and name='XamgXt';
explain SELECT SQL_NO_CACHE age,deptId,name FROM emp WHERE emp.age=30 and deptId=4 and name='XamgXt';

在这里插入图片描述

3.6 不等: 使用不等于(!= 或者 <>)的时候

mysql 在使用不等于(!= 或者<>)时, 有时会无法使用索引会导致全表扫描。
在这里插入图片描述

3.7 null:字段的is not null 与is null

当字段允许为 Null 的条件下:
is not null 用不到索引, is null 可以用到索引。
在这里插入图片描述在这里插入图片描述

3.8 like:like的前后模糊匹配

前缀不能出现模糊匹配!
在这里插入图片描述

3.9 or:减少使用or

在这里插入图片描述使用 union all 或者 union 来替代:
在这里插入图片描述

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

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

相关文章

getLong java_java.lang.Long.getLong()方法实例

全屏java.lang.Long.getLong(String nm) 方法确定具有指定名称的系统属性的long值。如果没有具有指定名称的属性&#xff0c;如果指定名称为空或null&#xff0c;或者该属性没有正确的数字格式&#xff0c;则返回null。声明以下是java.lang.Long.getLong()方法的声明public sta…

@JsonProperty注解解析

1. 概述 来源: JsonPrpperty是jackson包下的一个注解&#xff0c;详细路径(com.fasterxml.jackson.annotation.JsonProperty;)作用:JsonProperty用在属性上&#xff0c;将属性名称序列化为另一个名称。例子&#xff1a;public class Person{JsonProperty(value "name&qu…

java内部类为什么使用很少_java内部类有什么好处?为什么需要内部类?

提起Java内部类(Inner Class)可能很多人不太熟悉&#xff0c;实际上类似的概念在C里也有&#xff0c;那就是嵌套类(Nested Class)&#xff0c;关于这两者的区别与联系&#xff0c;在下文中会有对比。内部类从表面上看&#xff0c;就是在类中又定义了一个类(下文会看到&#xff…

jdk中提供的Collection、Collections、Collector、Collectors你分的清楚?

初次一看四个有点相似&#xff0c;而且有些时候一不小心还真有可能敲错&#xff0c;因为喜欢代码提示没仔细看提示&#xff0c;结果通过.去调用结果发现没有找到你想用的方法。所以写代码的时候需要注意一点这个区别 Collections.emptyList(); Collectors.toMap(......);//所在…

java swing panel问题_关于 Java swing Box 的使用问题

代码import javax.swing.*;import java.awt.*;public class C5Ex1_2 {final static int WIDTH 400;final static int HEIGHT 400;public C5Ex1_2() {JFrame jf new JFrame("program 1");jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.setSize(WIDTH, HEI…

SpringMVC注解@RequestParam全面解析____ 注解@RequestParam如何使用加与不加的区别

SpringMVC注解RequestParam全面解析 在此之前&#xff0c;写项目一直用的是RequestParam&#xff08;value“aa” requiredfalse&#xff09;这个注解&#xff0c;但是并不知道它的意思。现在懂了&#xff0c;特来记录下。 1、可以对传入参数指定参数名 1 RequestParam Stri…

java编写流星_纯Java代码实现流星划过天空

废话不多说了&#xff0c;直接给大家贴java代码了。import java.awt.Color;import java.awt.Graphics;import java.awt.image.BufferedImage;import javax.swing.JFrame;import javax.swing.JPanel;public class MeteorFly extends JFrame {final int MAX ; // (~)流星的个数f…

@requestbody和@requestparam到底什么作用

1、什么都不写 GET 可以自动封装为对象模型&#xff0c;没有的数值自动为0值 POST 请求体里面放了数据&#xff0c;但是还是使用了RequestParam里的数据 总结&#xff1a; 在不使用注解的情况下&#xff0c;相当于默认使用了RequestParam里的数据 &#xff08;这种理解是错…

linux mysql学习_Linux学习笔记(MySql操作)

忘记MySql密码&#xff1a;编辑mysql主配置文件 my.cnf 在[mysqld]字段下添加参数 skip-grant重启数据库服务,这样就可以进入数据库不用授权了 mysql -uroot修改相应用户密码 use mysql;update user setpasswordpassword(密码) where userroot;flushprivileges; (刷新)最后…

注解@RequestParam【不添加默认项注解】与@RequestBody的使用场景

一、前言 一直有这么一个疑问&#xff1a;在使用postman工具测试api接口的时候&#xff0c;如何使用 json 字符串传值呢&#xff0c;而不是使用 x-www-form-urlencoded 类型&#xff0c;毕竟通过 key-value 传值是有局限性的。假如我要测试批量插入数据的接口呢&#xff0c;使用…

java新建对象校验_验证某个对象是否是一个mock对象或者一个spy对象

C**f回复了y**4在课程中的问题&#xff1a;final和自动装配...v**g添加了笔记&#xff1a;James Gosl...c**k向课程作业中提交了代码我**…向课程作业中提交了代码2**9在课程中提出了问题&#xff1a;谢谢回复。应该是网络...v**g在课程中提出了问题&#xff1a;里面的内容SESS…

SpringMVC参数的传递——接收List数组类型的数据

前言 本文主要是记录SpringMVC中当前台传过来数组的时候&#xff0c;如何把前台传过来的数据封装到Controller层方法的形参中。 在了解下面参数如何传递前先记住两个结论&#xff1a; 当Ajax以application/x-www-form-urlencoded编码格式上传数据&#xff0c;必须使用JSON对…

rowdata java_Java RowDataUtil.addRowData方法代碼示例

本文整理匯總了Java中org.pentaho.di.core.row.RowDataUtil.addRowData方法的典型用法代碼示例。如果您正苦於以下問題&#xff1a;Java RowDataUtil.addRowData方法的具體用法&#xff1f;Java RowDataUtil.addRowData怎麽用&#xff1f;Java RowDataUtil.addRowData使用的例子…

properties配置文件的加密

要完成properties属性文件某些属性值的加密&#xff0c;和读取属性文件时进行解密&#xff0c;需要4个步骤 编写加密解密工具类手动通过加密解密工具类获得加密后的属性值密文&#xff0c;并把密文填写在properties文件中编写PropertyPlaceholderConfigurer的子类&#xff0c;…

【springmvc】@RequestParam详解以及加与不加的区别

以前写controller层的时候都是默认带上 RequestParam 的&#xff0c; 今天发现不加RequestParam 也能接收到参数 下面我们来区分一下加与不加的区别 这里有两种写法 RequestMapping("/list")public String test(RequestParam Long parentId) {}RequestMapping(&qu…

java同样作用的方法_Java的接口用途和方法

1&#xff0c; 抽象类解决不了, 根本问题是Java的类不能多继承.因为Tiger类继承了动物Animal类的特性(例如 move() 和 drink()) , 但是严格上来将 捕猎(hunt())并不算是动物的特性之一. 有些植物, 单细胞生物也会捕猎的.所以Tiger要从别的地方来继承Hunt()这个方法. 接口就发挥…

有了 IP 地址,为什么还要用 MAC 地址?

我认为&#xff0c;IP地址和MAC地址可以类比生活中寄快递的过程。 在整个网络中数据被封装成数据报文进行发送&#xff0c;就像我们生活中寄快递时将物品放进包裹中。而数据在路由器之间的跳转也可以看作是不同地区快递小哥对物流的交接。 IP地址 ip地址等价于快递包裹上的…

java运动员最佳配对_运动员最佳配对问题 - osc_y1pyjby5的个人空间 - OSCHINA - 中文开源技术交流社区...

这道题可以看为排列数的一个典型模块一、算法实现题&#xff1a;1、问题描述&#xff1a;羽毛球队有男女运动员各n人&#xff0c;给定2个nn矩阵P和Q。P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势&#xff1b;Q[i][j]则是女运动员i和男运动员j配合的女运动…

为什么POJO中变量不能用is开头

一、前言 在阿里编码规约中&#xff0c;有一个约定如下 【强制】POJO 类中的任何布尔类型的变量&#xff0c;都不要加 is 前缀&#xff0c;否则部分框架解析会引起序列 化错误。 但为什么类中的field不能用is开头呢&#xff1f;本文将从问题演示、框架源码&#xff08;本文使用…

java用NIO实现文件传输_Java Nio 实现文件的传输

使用Java Nio实现文件的传输1、ServerSocket.javapackage ch2;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.chann…