mysql索引分析之二

news2024/12/28 13:39:20

mysql索引分析之一
mysql索引分析之二

mysql索引分析之二

  • 1 mysql的索引类型
  • 2 Explain执行计划
    • 2.1 执行计划之 id 属性
      • 2.1.1 id 的属性相同表示加载表的顺序是从上到下
      • 2.1.2 id 值越大,优先级越高
      • 2.1.3 id 有相同,也有不同,同时存在
    • 2.2 执行计划之 select_type
      • 2.2.1 Simple
      • 2.2.2 Primary
      • 2.2.3 DEPENDENT SUBQUERY
      • 2.2.4 SUBQUERY
    • 2.3 执行计划之 possible keys
    • 2.4 执行计划之 key
    • 2.5 执行计划之 key_len
    • 2.6 执行计划之 type
  • 4 索引失效的七种情形
    • 4.1 组合索引最左原则
    • 4.2 最左前缀模糊查询
    • 4.3 数据类型不一致
    • 4.4 使用函数
    • 4.5 为null的查询
    • 4.6 使用算术运算
    • 4.7 全表扫描更快时

数据库中表和数据一一Oracle数据库scott数据库

1 mysql的索引类型

  • InnoDB 主键使用的是聚簇索引
  • MyISAM 所有的索引都是非聚簇索引

2 Explain执行计划

通过 explain 查看SQL执行的效率。通过 explain 可以查看如下信息:
1)查看表的加载顺序。
2)查看 sql 的查询类型。
3)哪些索引可能被使用,哪些索引实际使用了。
4)表之间的引用关系。
5)一个表中有多少行被优化器查询。
6)其他一些额外的辅助信息。

2.1 执行计划之 id 属性

ld 属性是 mysgl 对查询语句中提供查询序号。用于表示本次查询过程中加载表的顺序或则查询子句执行顺序
ld 届性有二种情况
id 相同表示加载表的顺序是从上到下
id 不同 id 值越大,优先级越高,越先被执行id 有相同,也有不同,同时存在。id 相同的可以认为是一组,从上往下顺序执行:在所有的组中,id 的值越大,优先级越高,越先执行。

2.1.1 id 的属性相同表示加载表的顺序是从上到下

EXPLAIN 
SELECT DNAME, ENAME 
FROM DEPT LEFT JOIN EMP ON DEPT.DEPTNO = EMP.DEPTNO

2.1.2 id 值越大,优先级越高

EXPLAIN 
SELECT ENAME, JOB, SAL 
FROM EMP 
WHERE DEPTNO IN (SELECT DEPTNO FROM DEPT)

2.1.3 id 有相同,也有不同,同时存在

EXPLAIN 
SELECT ENAME,DNAME 
FROM EMP 
JOIN (SELECT DEPTNO,DNAME FROM DEPT GROUP BY DEPTNO,DNAME) E ON EMP.DEPTNO = E.DEPTNO

2.2 执行计划之 select_type

对当前查询语句中的查询类型进行判断

2.2.1 Simple

表示当前查询语句是一个简单查询语句。不包含子查询,不包含联合查询,不包含连接查询

EXPLAIN 
SELECT ENAME, JOB, SAL
FROM EMP

2.2.2 Primary

如果执行的是一个包含子查询的查询,或则是一个联合查询。Primary 指向的外部查询语句或则是联合查询中的第一个子查询语句

EXPLAIN
SELECT EMPNO,ENAME FROM EMP 
UNION 
SELECT DEPTNO,DNAME FROM DEPT

2.2.3 DEPENDENT SUBQUERY

表示当前查询语句是一个子查询。并且执行条件依赖与外部查询提供的条件.

EXPLAIN 
SELECT E1.ENAME, E1.JOB, E1.SAL, (SELECT MAX(E2.SAL) FROM EMP E2 WHERE E2.JOB=E1.JOB)
FROM EMP E1

2.2.4 SUBQUERY

表示当前查询是一个子查询。并且这个子查询在执行时不害要得到外部查询的帮助

EXPLAIN 
SELECT ENAME, JOB, SAL, (SELECT COUNT(*) FROM DEPT) CNT
FROM EMP

2.3 执行计划之 possible keys

表示当前查询语句执行时可能用到的索引有哪些,在possible keys 可能出现多个索引,但是这些索引未必在本次查询使用到

2.4 执行计划之 key

表示当前查询语句真实使用的索引名称.如果这个字段为 null.则有两中可能.一个是当前表中没有索引。二是当前表有索引但是失效了.

2.5 执行计划之 key_len

如果本次查询使用了索引。则 key len 内容不为空
表示当前索引字段存储内突最大长度。这个长度不是精准值。只是 MysQL 估计的值。这个值越大越精准。在能得到相同结果时,这个值越小那么查询速度越快

2.6 执行计划之 type

Type 属性描述 MysQL 对本次查询的评价.是执行计划中的一个重
要属性。查询语句执行效率从高到底的顺序依次是.
NUILL:无需访问表或者索引,比如获取一个索引列的最大值或最小值。
system/const: 当查询最多匹配一行时,常出现于 where 条件是=的情况。system 是 const 的一种特殊情况,既表本身只有一行数据的情况。
eq ref: 关联查询时,根据唯一非空索引进行查询的情况。
ref: 查询时,根据非唯一非空索引进行查询的情况
range: 在一个索引上进行范围查找。
index: 遍历索引树查询,通常发生在查询结果只包含索引字段时
ALL:全表扫描,没有任何索引可以使用时。这是最差的情况,应该避免。

4 索引失效的七种情形

4.1 组合索引最左原则

在复合索引查询中,如果不是按照索引的最左列开始查找,则无法使用索引。

4.2 最左前缀模糊查询

like的模糊查询以%开头,索引失效。

SELECT * FROM t_student WHERE name LIKE '%太白';

4.3 数据类型不一致

如数据库表字段类型为varchar,where条件用number,索引会失效。

SELECT * FROM t_student WHERE idcard = 410181200009065029;
# 数据库中idcard为varchar类型导致索引失效。

4.4 使用函数

对索引的字段使用内部函数,索引也会失效。此情况下应该建立基于函数的索引。

SELECT * FROM t_student 
WHERE DATE_FORMAT(create_time,'%Y-%m-%d') = '2022-06-02';
# create_time字段设置索引,那就无法使用函数,否则索引失效。

4.5 为null的查询

索引不存储null值,如果不限制索引列是not null,数据库会认为索引列有可能存在空值,所以不会按照索引进行计算。比如:

# 不走索引。
SELECT * FROM t_student WHERE address IS NULL;
# 走索引。
SELECT * FROM t_student WHERE address IS NOT NULL;

建议大家这设计字段的时候,如果没有必要的要求必须为NULL,那么最好给个默认值空字符串,这可以解决很多后续的麻烦(切记)。

4.6 使用算术运算

对索引列进行(+,-,*,/,!, !=, <>)等运算,会导致索引失效。

SELECT * FROM user WHERE age - 1 = 20;

4.7 全表扫描更快时

如果数据库预计使用全表扫描要比使用索引快,则不使用索引。

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

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

相关文章

浅析 Redis 主从同步与故障转移原理

我们在生产中使用 Redis&#xff0c;如果只部署一个 Redis 实例&#xff0c;当该实例宕机&#xff0c;到恢复之前都不可用&#xff1b;虽说 Redis 一般都用来做缓存&#xff0c;但不可用给业务系统带来的影响也是不小的&#xff0c;流量大时甚至会导致整个服务宕机。所以 Redis…

6.0.4:GrapeCity Documents for Excel GcExcel Crack

在更短的时间内生成 Excel 电子表格&#xff0c;不依赖于 Excel&#xff01; 在任何应用程序中转换、计算、格式化和解析电子表格。 快速高效&#xff1a;其轻巧的尺寸意味着 Documents for Excel 针对快速处理大型 Excel 文档进行了优化 使用适用于 Windows、Linux 和 Mac 的…

Spring Cloud Sentinel实战(一)- Sentinel介绍

Sentinel介绍 什么是Sentinel 分布式系统的流量防卫兵&#xff1a;随着微服务的普及&#xff0c;服务调用的稳定性变得越来越重要。Sentinel以“流量”为切入点&#xff0c;在流量控制、断路、负载保护等多个领域开展工作&#xff0c;保障服务可靠性。 特点&#xff1a; 1. 2…

【尚硅谷MySQL入门到高级-宋红康】数据库概述

1、为什么要使用数据库 数据的持久化 2、数据库与数据库管理系统 2.1 数据库的相关概念 2.2 数据库与数据库管理系统的关系 3、 MySQL介绍 MySQL从5.7版本直接跳跃发布了8.0版本 &#xff0c;可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上做了显著的改进与增强&a…

c++提高篇——STL常用算法

STL常用算法一、常用遍历算法一、for_each 遍历容器二、transform 搬运容器到另一个容器中二、常用查找算法一、find二、find_if三、adjacent_find四、binary_search五、count六、count_if三、常用排序算法一、sort二、random_shuffle三、 merage四、reverse四、常用拷贝和替换…

推荐系统遇上深度学习(一四三)-[快手]一致性终身用户行为建模方法TWIN

标题&#xff1a;《TWIN: TWo-stage Interest Network for Lifelong User Behavior Modeling in CTR Prediction at Kuaishou》链接&#xff1a;https://arxiv.org/pdf/2302.02352.pdf今天给大家分享的是快手近期发表的终身行为序列建模上的工作&#xff0c;当前工业界主流的方…

一文打通计算机字符编码

有关编码的基础知识 1. 位 bit 最小的单元 字节 byte 机器语言的单位 1byte8bits 1KB1024byte 1MB1024KB 1GB1024MB 2.进制 二进制 binary 八进制 octal 十进制 decimal 十六进制 hex 3.字符 字符&#xff1a;是各种文字和符号的总称&#x…

Linux 自带的 LED 灯驱动实验

目录 一、配置内核 二、设备树节点编写 1、确定compatible 属性值 2、编写节点 三、验证 测试 其实 Linux 内核已经自带了 LED 灯驱动&#xff0c;要使用 Linux 内核自带的 LED 灯驱动首先得先配置 Linux 内核&#xff0c;使能自带的 LED 灯驱动。 一、配置内核 在Linux内…

【LeetCode】剑指 Offer(10)

目录 题目&#xff1a;剑指 Offer 27. 二叉树的镜像 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 28. 对称的二叉树 - 力扣&#xff0…

【人脸识别】FROM:提升遮挡状态下的人脸识别效果

论文题目&#xff1a;《End2End Occluded Face Recognition by Masking Corrupted Features》 论文地址&#xff1a;https://arxiv.org/pdf/2108.09468v3.pdf 代码地址&#xff1a;https://github.com/haibo-qiu/from 1.前言 人脸识别技术已经取得了显著的进展&#xff0c;主要…

几个开源 RUST 安全算法库

这段时间把 RUST 语法过了一遍&#xff0c;写一些简单的 Demo 程序没啥问题了&#xff0c;但离掌握这门语言还差的远&#xff0c;需要项目实战才行。我决定从之前研究过的国密算法入手&#xff0c;使用 RUST 实现国密算法。从头编写算法不太现实&#xff0c;上网搜了一下&#…

pandas数据分析36——快速独热和反独热处理

做数据预处理的时候&#xff0c;很多文本分类变量需要变为数值型。 下面提供一些方法&#xff0c;就以最经典的泰但尼克号数据集作为例子。 先导包读取数据 import numpy as np import pandas as pd datapd.read_csv(train.csv) datadata.drop(columns[Name,Ticket,Cabin],…

jmeter报错: java.io.EOFException: Unexpected end of ZLIB input stream

一、背景&#xff1a; 1.1 报错信息 java.io.EOFException: Unexpected end of ZLIB input stream at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:240) at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158) at java.util.zip…

分割线-----

各位好&#xff0c;之前的文章就不再回复和更新了&#xff0c;都是大学的时候随便玩玩的。真的不能算学术研究。致敬过去的自己。努力真的可以幸福&#xff01;虽然还是一样在搬砖&#xff01;

Allegro如何快速锁定整板测试点操作指导

Allegro如何快速锁定整板测试点操作指导 在做PCB设计的时候,会需要给整板添加测试点,用于飞针测试,如下图 在测试点添加好之后,文件输出之前需要把测试点全部锁定,避免因为测试点模具开好,测试点被移动的情况出现 如果逐个锁定Via,容易遗漏 Allegro支持快速锁定整板测…

计算机网络高频知识点(一)

目录 一、http状态码 二、浏览器怎么数据缓存 三、强缓存与协商缓存 1、强缓存 2、协商缓存 四、简单请求与复杂请求 五、PUT 请求类型 六、GET请求类型 七、GET 和 POST 的区别 八、跨域 1、什么时候会跨域 2、解决方式 九、计算机网络的七层协议与五层协议分别指…

华纬科技冲刺A股上市:毛利率下降幅度较大,金雷为实控人

近日&#xff0c;华纬科技股份有限公司&#xff08;下称“华纬科技”&#xff09;递交招股书&#xff0c;准备在深圳证券交易所主板上市。本次冲刺上市&#xff0c;华纬科技计划募资4.34亿元&#xff0c;将用于新增年产8000万只各类高性能弹簧及表面处理技改项目、高精度新能源…

经验之谈——指标异常了怎么办?

本文参考了数据万花筒的文章&#xff0c;结合我自己工作经验。希望给大家一些帮助。 指标异常排查&#xff0c;是数据分析师的工作重点之一&#xff0c;是各行各业数据分析师都绕不开的话题。 本文试图回答&#xff1a; 1、指标波动的影响因素有哪些&#xff1f; 2、如何快速…

Verilog 数据类型和数组简介

在这篇文章将讨论 verilog 中最常用的数据类型&#xff0c;包括对数据表示&#xff0c;线网类型、变量类型&#xff0c;向量类型和数组的讨论。尽管 verilog 被认为是一种弱类型语言&#xff08;loosely typed&#xff09;&#xff0c;但设计者仍必须在 Verilog 设计中为每个端…

处理器管理

处理器状态处理器管理是操作系统中重要组成部分&#xff0c;负责管理、调度和分配计算机系统的重要资源——处理器&#xff0c;并控制程序执行由于处理器管理是操作系统最核心的部分&#xff0c;无论是应用程序还是系统程序&#xff0c;最终都要在处理器上执行以实现其功能&…