二、mysql索引分析之二

news2024/10/2 16:23: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/374278.html

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

相关文章

【GO】k8s 管理系统项目22[前端部分–工作负载-Deployment]

k8s 管理系统项目[前端部分–工作负载-Deployment] 1. Deployment页面设计 src/layout/Layout.vue 功能 列表详情新增更新删除重启副本数 Main的布局 2. 连接配置 src/views/common/Config.js export default {//后端接口路径loginAuth: http://localhost:9091/api/login,…

RCEE: Event Extraction as Machine Reading Comprehension 论文解读

RCEE: Event Extraction as Machine Reading Comprehension 论文&#xff1a;Event Extraction as Machine Reading Comprehension (aclanthology.org) 代码&#xff1a;jianliu-ml/EEasMRC (github.com) 期刊/会议&#xff1a;EMNLP 2020 摘要 事件提取(Event extraction,…

Slurm集群调度策略详解(2)-回填调度

1. slurm集群调度系统简介 作业调度系统其实就是指按一定策略把并行程序的各子任务或者是面向多用户的一组作业按一定的选择策略使之与各计算节点的空闲资源相对应&#xff0c;让其在对应的资源上运行&#xff0c;所以作业调度系统是联系上层应用和下层资源的中枢。一个集群资…

纯x86汇编实现的多线程操作系统实践 - 第六章 AP1的用户进程

AP1用户进程的代码为task1.asm。该用户进程将调用0x80系统中断在界面上显示一张BMP格式的图片。用户进程还使用了彩色转灰色技术&#xff0c;轮流显示该图片的彩色和灰色图。代码解释如下&#xff1a;调用0x39号系统中断&#xff0c;从300号扇区获得一个扇区的数据&#xff08;…

【华为OD机试模拟题】用 C++ 实现 - 身高排序(2023.Q1)

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

每日学术速递2.27

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CL 1.FiTs: Fine-grained Two-stage Training for Knowledge-aware Question Answering 标题&#xff1a;FiTs&#xff1a;用于知识感知问答的细粒度两阶段训练 作者&#xff1a;Qichen…

JavaWeb JavaBean,MVC三层架构

9、JavaBean 实体类 JavaBean有特定的写法&#xff1a; 必须要有一个无参构造属性必须私有化必须有对应的get/set方法&#xff1b; 一般用来和数据库的字段做映射 ORM&#xff1b; ORM &#xff1a;对象关系映射 表—>类字段–>属性行记录---->对象 people表 …

Qt 小项目 图片浏览系统

引言 本系统支持&#xff0c;自动播放&#xff0c;左右拖动切换&#xff0c;点击列表切换&#xff0c;点击按钮切换&#xff1b;是一个标准的图像浏览软件。 Windows 图片浏览器&#xff0c;可以查看当前文件夹下的图片&#xff0c;往上翻、往下翻并且自动播放&#xff1b; …

这只乌龟,当然离不开函数了!

什么是函数&#xff1f;函数就是执行特定任务和以完成特定功能的一段代码为什么需要函数&#xff1f;复用代码隐藏实现细节提高可维护性提高可读性便于调试函数的创建def 函数名 ([输入参数]) :函数体[return xxx]函数名需要遵循字母、数字、下划线# 这里的a&#xff0c;b是形式…

03 流程控制

3.1 条件判断3.2 循环控制3.3 中断循环 3.1 条件判断 if 条件判断 &#xff1a;单分支&#xff08;if&#xff09;、双分支&#xff08;if…else…&#xff09;、多分支&#xff08;if … else if … else&#xff09;Switch&#xff08;Scala并没有 switch&#xff0c;用的是…

2023年鞋服配饰行业如何玩转全域经营?

2023年&#xff0c;鞋服配饰行业私域已进入深水区&#xff0c;这就对私域运营提出了更高的挑战和目标&#xff0c;企业纷纷发力以私域为基石、以消费者为核心的全域经营。 不过&#xff0c;虽然鞋服配饰行业私域起步早&#xff0c;玩法多。但在迈向全域经营的过程中&#xff0…

全网详细介绍nginx的反向代理、正向代理配置,location的指令说明,反向代理的两个示例代码以及全局块,events块和http快的说明。

文章目录1. 文章引言2. 何谓反向代理3. 解析nginx的配置文件3.1 全局块(global block)3.2 events块(events block)3.3 http块(http block)4. 如何配置反向代理4.1 反向代理示例14.2 反向代理示例25. 补充说明5.1 location指令说明5.2 nginx完整配置文件1. 文章引言 如果你的服务…

聚合效度全流程

聚合效度分析流程如下&#xff1a; 一、聚合效度定义 聚合效度&#xff08;convergent validity&#xff09;&#xff0c;又称收敛效度&#xff0c;是指测量同一变量的测量项会落在同一因子上&#xff0c;强调本应该在同一因子下的测量项&#xff0c;确实在同一因子下。即一个…

基于nodejs+vue地方特色的风景文化宣传网站vscode

管理员可以根据系统给定的账号进行登录&#xff0c;登录后可以进入木里风景文化管理平台对木里风景文化所有模块进行管理。包括查看和修改自己的个人信息以及登录密码。 该系统为每一个用户都分配了一个用户账号&#xff0c;用户通过账号的登录可以在系统中查看木里风景文化信息…

怎么依靠网络赚钱,网上可以做什么副业

如今&#xff0c;网上赚钱已经成为许多人职业生涯的选择之一。网上有很多可靠的兼职&#xff0c;让你在家里轻松赚钱。今天给大家推荐五份可靠的网上兼职。一、怎样选择可靠的网络兼职可靠的网络兼职一般是指在家通过网络平台完成兼职任务&#xff0c;完成任务后即可获得报酬。…

JVM中TLAB(Thread Local Allocation Buffer)+逃逸分析

1、为什么有TLAB&#xff08;Thread Local Allocation Buffer&#xff09;堆区是线程共享区域&#xff0c;任何线程都可以访问到堆区中的共享数据 由于对象实例的创建在JVM中非常频繁&#xff0c;因此在并发环境下从堆区中划分内存空间是线程不安全的 为避免多个线程操作同一地…

java地图导出——添加经纬线

概述 前面的文章Node实现切片的拼接和地图的导出和Java实现地图的导出分别讲述可如何在node和java中实现切片的拼接以及地图的导出。本文&#xff0c;书接前文&#xff0c;实现java导出时经纬度的添加。 实现后效果 实现 完整的实现思路流程如下图&#xff1a; 1. 根据切片…

什么是Makefile?如何编写Makefile?

&#x1f947;今日学习目标&#xff1a;什么是Makefile&#xff1f;如何编写Makefile&#xff1f; &#x1f935;‍♂️ 创作者&#xff1a;JamesBin ⏰预计时间&#xff1a;10分钟 &#x1f389;个人主页&#xff1a;嵌入式悦翔园个人主页 &#x1f341;专栏介绍&#xff1a;L…

RabbitMQ实现死信队列

目录死信队列是什么怎样实现一个死信队列说明实现过程导入依赖添加配置编写mq配置类添加业务队列的消费者添加死信队列的消费者添加消息发送者添加消息测试类测试死信队列的应用场景总结死信队列是什么 “死信”是RabbitMQ中的一种消息机制&#xff0c;当你在消费消息时&#…

单调栈(C/C++)

目录 1. 单调栈的定义 2. 单调栈的常见用途 3. 案例分析 3.1 暴力解法 3.2 单调栈 4. 单调栈总结 1. 单调栈的定义 单调栈顾名思义&#xff0c;就是栈内的元素是单调的。根据栈内元素的单调性的不同&#xff0c;可以分为&#xff1a; 单调递增栈&#xff1a;栈内元素是单…