mysql索引分析之二

news/2024/4/25 22:39:40/文章来源:https://blog.csdn.net/Michael_lcf/article/details/106992798

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.luyixian.cn/news_show_74628.aspx

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

相关文章

嵌入式系统硬件设计与实践(第一步下载eda软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 现实生活中&#xff0c;我们经常发现有的人定了很多的目标&#xff0c;但是到最后一个都没有实现。这听上去有点奇怪&#xff0c;但确实是实实在在…

【华为OD机试模拟题】用 C++ 实现 - 能力组队(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明能力组队题目输入输出示例一输入输出说明示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 O…

Word处理控件Aspose.Words功能演示:使用 C++ 在 Word (DOC/DOCX) 中添加或删除水印

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…

Python实现贝叶斯优化器(Bayes_opt)优化LightGBM分类模型(LGBMClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。1.项目背景贝叶斯优化器(BayesianOptimization) 是一种黑盒子优化器&#xff0c;用来寻找最优参数。贝叶斯优化器是基…

第50天|LeetCode739. 每日温度、LeetCode496. 下一个更大元素 I

1.题目链接&#xff1a;739. 每日温度 题目描述&#xff1a; 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&a…

使用docker pull 跨系统架构拉取镜像

使用docker pull 跨系统架构拉取镜像使用docker pull 跨系统架构拉取镜像docker hub上找到相应的镜像在个人电脑中的执行拉取镜像命令&#xff1a;执行查看镜像命令&#xff1a;执行检查镜像命令&#xff1a;执行保存镜像命令&#xff1a;使用docker pull 跨系统架构拉取镜像 …

断点续传实现

断点续传 1、 什么是断点续传 通常视频文件都比较大&#xff0c;所以对于媒资系统上传文件的需求要满足大文件的上传要求。http协议本身对上传文件大小没有限制&#xff0c;但是客户的网络环境质量、电脑硬件环境等参差不齐&#xff0c;如果一个大文件快上传完了网断了没有上…

高频面试题|RabbitMQ如何防止消息的重复消费?

一. 前言最近有很多小伙伴开始找工作&#xff0c;在面试时&#xff0c;面试官经常会问我们这样一个题目&#xff1a;RabbitMQ如何防止重复消费?有很多小伙伴这个时候都在想&#xff0c;消息怎么还会重复消费呢???.......所以他们在面试后就跑来问壹哥&#xff0c;针对这个比…

Python实现GWO智能灰狼优化算法优化循环神经网络回归模型(LSTM回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。1.项目背景灰狼优化算法(GWO)&#xff0c;由澳大利亚格里菲斯大学学者 Mirjalili 等人于2014年提出来的一种群智能优…

针对面试官的盘问-如何回答职场中的一些问题

(点击即可收听)初入职场,面对面试官的提问,如何回答01你为什么从上家公司离职?个人成长不足,不符合自己的预期&#xff08;关系到个人竞争力,希望找到一份更有挑战,个人提升更大的工作&#xff09;,切忌与面试官倒苦水,说前公司老板的不是业务发展缓慢,上升空间有限(有些不符合…

力扣-换座位

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;626. 换座位二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总结前言 …

redis(11)事务秒杀案例

秒杀案例描述 现在有1个秒杀的功能&#xff0c;1个原来价值5000元的手机现在搞活动&#xff0c;降价到1块钱&#xff0c;做秒杀活动。库存就10个&#xff0c;假设有10000人抢购。 目前逻辑是&#xff1a;抢到了商品库存就减1&#xff0c;然后把用户id加入到秒杀成功者清单中 Re…

【华为OD机试模拟题】用 C++ 实现 - 统计匹配的二元组个数(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明统计匹配的二元组个数题目输入输出描述示例一输入输出说明示例二输入输出说明备注Code使用说明 参加华为od机试,一定要注意不要完全背诵代码&

【华为OD机试模拟题】用 C++ 实现 - 卡片组成的最大数字(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明卡片组成的最大数字题目输入输出描述示例一输入输出示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高…

高压放大器在声波谐振电小天线收发测试系统中的应用

实验名称&#xff1a;高压放大器在声波谐振电小天线收发测试系统中的应用研究方向&#xff1a;信号传输测试目的&#xff1a;声波谐振电小天线颠覆了传统电小天线以电磁波谐振作为理论基础的天线发射和接收模式&#xff0c;它借助声波谐振实现电磁信号的辐射或接收。因为同频的…

CPRI和10GBASE-KR的关系

目录 10GBASE-KR 10GBASE-KR的分层结构 10GBASE-KR 电气特性 发送器特性 接收器特性 CPRI CPRI与10GBASE-KR的差异 基于对CPRI协议和10GBASE-KR规范的分析完成本文&#xff0c;尝试解答CPRI和10GBASE-KR的关系问题&#xff0c;尝试给出如下结论&#xff1a; 当CPRI支持背…

使用xca工具生成自签证书

本文使用 xca 生成自签证书。 概述 之前使用 openssl 生成证书&#xff0c;在 golang 中测试&#xff0c;发现客户端连接失败&#xff0c;经查发现是Subject Alternative Name不支持导致的。因虚拟机 openssl 版本较低&#xff0c;有个功能无法实现&#xff0c;且升级麻烦&…

Matlab论文插图绘制模板第79期—无线条等高线填充图

资源群里有朋友问如何绘制等高线填充图&#xff0c;但删除线条&#xff0c;只保留填充颜色的那种。 那么&#xff0c;本期就来分享一下无线条等高线填充图的绘制模板。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;Matlab论文插图绘制模板系列&#xff0c;旨在降低大…

Linux基础命令-stat显示文件的状态信息

文章目录 stat 命令介绍 语法格式 基本参数 测试三个时间的变化过程 1&#xff09;使用cat命令 2&#xff09;使用echo命令 3&#xff09;使用chmod命令 4&#xff09;使用vim命令 参考实例 1&#xff09;显示文件的状态信息 2&#xff09;以简洁的形式显示状态信…

【论文速递】COLING 2022 - 带有事件论元相关性的事件因果关系抽取

【论文速递】COLING 2022 - 带有事件论元相关性的事件因果关系抽取 【论文原文】&#xff1a;Event Causality Extraction with Event Argument Correlations 【作者信息】&#xff1a;Cui, Shiyao and Sheng, Jiawei and Cong, Xin and Li, Quangang and Liu, Tingwen and S…