Mysql进阶(中) -- 索引

索引上部分 -> Mysql进阶(上) -- 存储引擎,索引_千帐灯无此声的博客-CSDN博客 

👂 爸爸妈妈 - 王蓉 - 单曲 - 网易云音乐

👈目录看左栏

目录

🌼索引

🐻性能分析 - show profiles

🐻性能分析 - explain

🍌使用规则 - 验证索引效率

🍌使用规则 - 最左前缀法则

🍌使用规则 - 索引失效情况1

🍌使用规则 - 索引失效情况2

🍌使用规则 - SQL提示

🍌使用规则 - 覆盖索引&回表查询

🍌使用规则 - 前缀索引

🍌使用规则 - 单列&联合索引

🍉设计原则

🍉小结


🌼索引

🐻性能分析 - show profiles

开关未开启👇

打开开关👇

突然,出现了BUG👇

为此我专门写了一篇文章 -> Finalshell连接Linux超时之Connection timed out: connect_千帐灯无此声的博客-CSDN博客

开关打开后,开始查询👇

查看每一条SQL语句的耗时👇

根据name查询比根据id查询慢很多👆

查询指定SQL语句👇

查询指定SQL语句CPU使用情况👇

🐻性能分析 - explain

Datagrip,创建3个表👇

use itcast;


create table student(
    id   int auto_increment comment '主键ID' primary key,
    name varchar(10) null comment '姓名',
    no   varchar(10) null comment '学号'
)comment '学生表';

INSERT INTO student (name, no) VALUES ('黛绮丝', '2000100101');
INSERT INTO student (name, no) VALUES ('谢逊', '2000100102');
INSERT INTO student (name, no) VALUES ('殷天正', '2000100103');
INSERT INTO student (name, no) VALUES ('韦一笑', '2000100104');



create table course(
    id int auto_increment comment '主键ID' primary key,
    name varchar(10) null comment '课程名称'
)comment '课程表';

INSERT INTO course (name) VALUES ('Java');
INSERT INTO course (name) VALUES ('PHP');
INSERT INTO course (name) VALUES ('MySQL');
INSERT INTO course (name) VALUES ('Hadoop');



create table student_course(
    id int auto_increment comment '主键' primary key,
    studentid int not null comment '学生ID',
    courseid  int not null comment '课程ID',
    constraint fk_courseid foreign key (courseid) references course (id),
    constraint fk_studentid foreign key (studentid) references student (id)
)comment '学生课程中间表';

INSERT INTO student_course (studentid, courseid) VALUES (1, 1);
INSERT INTO student_course (studentid, courseid) VALUES (1, 2);
INSERT INTO student_course (studentid, courseid) VALUES (1, 3);
INSERT INTO student_course (studentid, courseid) VALUES (2, 2);
INSERT INTO student_course (studentid, courseid) VALUES (2, 3);
INSERT INTO student_course (studentid, courseid) VALUES (3, 4);

Datagrip中,右键student_course,打开Diagram可视化👇

3张表联查,需要2个where来消除无效笛卡尔积👇 

查询所有学生选修的课程👇

查询连接顺序👇

查询选修了Mysql的学生👇

(1)分3步实现

(2)子查询1步实现👇

类似的,自己可以再写一个,查询韦一笑选修了什么课程👇

先逐步拆分👇

再子查询👇  --  书写顺序是:先进入course表,再进入中间表,最后进入student表

(1)course

(2)student_course

(3)student

再用explain / desc看看执行顺序👇

但是执行顺序和书写顺序不同

执行顺序,先执行内层,也就是先student,再course,最后中间表

id越大,越先执行;id相同,按顺序执行

explain各字段含义👇

再讲下type👇

根据 主键 或 唯一索引 访问,才会出现const👇比如

唯一索引👇

所以select时,尽量防止出现all,all代表全表扫描,性能较低

再讲下possible_key

最后讲下👇

需要重点关注的字段👇

尤其是type,作为性能指标 

🍌使用规则 - 验证索引效率

加个  \G ,查询字段以 row 的方式显示 

 执行show index from tb_sku; 后,发现没有 sn 的索引,所以查询1条记录的时间相当于查询 * 的时间,下面我们需要创建 sn 的索引👇

创建耗时 49s ,因为创建索引,实际上是给 800万条数据,构造B+Tree的过程

再次查询👇

从 18s 提升到了 0.02s

接着explain查看索引👇

sn 这个字段使用了索引 

🍌使用规则 - 最左前缀法则

不跳过索引中的列👆

show index👇可以看到3个索引的顺序

查询👇

去掉结尾 status 再次查询👇

👆最左边的字段 profession 存在,并且没有跳过中间的列

继续查询

这次跳过 profession(索引最左边的列),索引全部失效👇

而且 type = all,全表扫描👆,因为不满足最左前缀法则

进行个对比

(1)

(2) 

索引长度一样,说明(1)没有走 status 的索引,因为不满足最左前缀法则,中间跳过了 age 的索引,所以索引部分失效

possible_keys可能的索引,key实际使用的索引

当顺序改变时,索引长度不变,满足最左前缀法则👇

除了 最左前缀法则,还有 范围查询👇

(1)由索引长度,status 失效了

(2)当 > 改成 >= , status生效

所以,一般业务中,尽量使用 >=, <=,而不是 >

🍌使用规则 - 索引失效情况1

在索引列上进行 运算,索引列会失效,全表扫描👇

substring截取字串,第二个参数,下标从1开始 

 

可能用到的索引,用了;但实际的 key,没用到,还是全表扫描

尾部模糊匹配

头部模糊匹配

总之前面不能加 % 和 _,大数据查询下,会全表扫描,大数据下性能较低

🍌使用规则 - 索引失效情况2

创建age索引👇

如果Mysql评估走索引比全表扫描慢,则不走索引

当profession置空,结果会反过来👇

走不走索引,主要看is null 或 is not null占少数还是多数,少数就会走索引

多数的话,Mysql默认不如全表扫描,会直接全表扫描,所以不走索引

🍌使用规则 - SQL提示

注意,为了恢复profession,不是删表再重新插入,而是清空再insert,否则之前创建的联合索引等,还得重新创建👇

create index idx_user_name on tb_user(name);
 
create unique index idx_user_phone on tb_user(phone);
 
create index idx_user_pro_age_sta on tb_user(profession,age,status);
 
create index idx_user_age on tb_user(age);

create index idx_user_email on tb_user(email);

给profession创建单列索引👇

一个单列,一个联合索引,Mysql选择了联合索引👇

提示Mysql到底用哪个索引👇

use用,ignore不用,force必须用,跟在表名后

🍌使用规则 - 覆盖索引&回表查询

一般using index condition对应select *

而using where; using index对应具体的select

(1)

(2)

(1)需要回表查询,效率较低,(2)不需要

因为pro, age, status的联合索引,属于二级索引,二级索引叶子节点挂的是id,此时(2)中直接查询二级索引,就得到了需要的数据

但是(1)中name字段,不在这个二级索引中,还要到id的聚集索引中查找

关于聚集索引,二级索引和回表查询,可以看👇文章中,索引-分类这一部分

Mysql进阶(上) -- 存储引擎,索引_千帐灯无此声的博客-CSDN博客

覆盖索引,通俗点讲,就是只需要查询一次,通过索引本身可以满足查询需求。

覆盖索引不需要回表查询。

至于上面提到的,覆盖索引时,避免使用 select *,是因为,容易发生回表查询,除非创建联合索引,而查询的列正好是联合索引包含的列和id

一道面试题👇

如何简历索引,建立怎样的索引,才能是最优方案呢👇

答:根据username, password两个字段,建立联合索引(二级索引),而二级索引叶子下挂的就是id,即覆盖索引,不需要回表查询

🍌使用规则 - 前缀索引

例如,计算email的选择性👇

记录总数24👇

不重复的email也是24👇

所以email的选择性 = 24 / 24 = 1👇

观察前缀索引,先截取前10个字符,节约索引空间👇

截取前9个👇

直到.....👇

截取到前5个,依然是9583

针对email建立前缀索引

两个5表示,对email取5个前缀

Sub_part表示截取字段

前缀索引使用👇

大文本或长字符串,采取前缀索引,降低索引体积,提高查询效率,避免对磁盘IO的浪费

前缀索引查询流程

首先,主键id会创建聚集索引,我们再创建前缀索引

截取前5个字符是因为,区分度已经足够高

👆逐个匹配,比如 lvbu6,l比d大,所以往右走,来到lvbu6.........

到了叶节点,拿到对应数据后,我们还得对整个email进行对比.....

🍌使用规则 - 单列&联合索引

补充:键盘右上角,Home键定位命令行头,Ended键定位尾部。

下面解释为什么,多个联合条件时,推荐使用,联合索引👇

创建联合索引

执行下列语句

extra为Null,表示回表查询了👇因为单列索引和联合索引都存在时,默认单列

当我们建议Mysql使用联合索引👇

Using index表示覆盖索引,不需要回表查询

联合索引情况👇

注意,创建联合索引时,需要考虑字段顺序,根据最左前缀法则,最左边的列,必须非空,否则索引会失效

🍉设计原则

(1)比如,100万条数据,就需要建立索引,而几千几万条数据是不需要的

(3)区分度指的是,比如身份证,姓名,部门,区分度最高的是身份证

(4)大文本,长字符串,需要建立前缀索引(也需要考虑区分度)

(5)尽量使用联合索引,可以覆盖索引,避免回表

(6)只建立有必要的索引,降低维护成本

🍉小结

--

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

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

相关文章

关于自动化测试用例失败重试的一些思考

自动化测试用例失败重跑有助于提高自动化用例的稳定性&#xff0c;那我们来看一下&#xff0c;python和java生态里都有哪些具体做法&#xff1f; 怎么做 如果是在python生态里&#xff0c;用pytest做测试驱动&#xff0c;那么可以通过pytest的插件pytest-rerunfailures来实现…

实时时钟DS1302原理详解和单片机编程

一、DS1302的功能 DS1302是美国DALLAS推出的一款高性能、低功耗的日历时钟芯片。 DS1302是一种串行接口的实时时钟&#xff0c;芯片内部具有可编程的日历时钟和31个字节的静态RAM&#xff0c;日历时钟可以自动进行闰年补偿&#xff0c;计时准确&#xff0c;接口简单&#xff…

React Dva项目 简单引入models中的所有JS文件

我们前面接触的 Dva项目 models目录下的文件还要一个一个引入 其实体验并不是很好 而且如果项目很大那就比较麻烦了 我们可以在 models 下创建一个 index.js 文件 编写代码如下 const context require.context("./", false, /\.js$/); export default context.key…

SNAP插件sen2Three去云操作

1.先把这篇文章看了 2.去官网下载Sen2Three 3.这时候可以大概看看Sen2Three的官方文档&#xff0c;我们知道了需要用anaconda2环境 4.我是已经安装有anaconda3,所以需要两个并存&#xff0c;此时可以参考这篇文章 5.这是ananconda2的链接&#xff0c;直接下载安装即可&#xff…

Delphi Professional Crack,IDE插件开发和扩展IDE

Delphi Professional Crack,IDE插件开发和扩展IDE 构建具有强大视觉设计功能的单源多平台本机应用程序。 Delphi帮助您使用Object Pascal为Windows、Mac、Mobile、IoT和Linux构建和更新数据丰富、超连接、可视化的应用程序。Delphi Professional适合个人开发人员和小型团队构建…

20230807在WIN10下使用python3将TXT文件转换为DOCX(在UTF8编码下转换为DOCX有多一行的瑕疵)

20230807在WIN10下使用python3将TXT文件转换为DOCX&#xff08;在UTF8编码下转换为DOCX有多一行的瑕疵&#xff09; 2023/8/7 12:58 https://translate.google.com/?slen&tlzh-CN&opdocs 缘起&#xff0c;由于google的文档翻译不支持SRT/TXT格式的字幕&#xff0c;因此…

Transformer学习笔记

Transformer学习笔记 前言前提条件相关介绍Transformer总体架构编码器&#xff08;Encoder&#xff09;位置编码&#xff08;Positional Encoding&#xff09;get_attn_pad_mask函数&#xff08;Padding Mask&#xff09;EncoderLayerMultiHeadAttentionScaledDotProductAttent…

webpack基础知识七:说说webpack proxy工作原理?为什么能解决跨域?

一、是什么 webpack proxy&#xff0c;即webpack提供的代理服务 基本行为就是接收客户端发送的请求后转发给其他服务器 其目的是为了便于开发者在开发模式下解决跨域问题&#xff08;浏览器安全策略限制&#xff09; 想要实现代理首先需要一个中间服务器&#xff0c;webpac…

Llama 2 云端部署与API调用【AWS SageMaker】

Meta 刚刚发布了 Llama 2 大模型。如果你和我们一样&#xff0c;你一定会迫不及待地想要亲自动手并用它来构建。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 使用任何类型的 LLM 进行构建的第一步是将其托管在某处并通过 API 使用它。 然后你的开发人员可以轻松地将…

HTML5注册页面

分析 注册界面实际上是一个表格&#xff08;对齐&#xff09;&#xff0c;一行有两个单元格。 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevic…

致远OA协同管理软件无需登录getshell

一个男子汉&#xff0c;老守在咱村那个土圪崂里&#xff0c;又有什么意思&#xff1f;人就得闯世事&#xff01;安安稳稳活一辈子&#xff0c;还不如痛痛快快甩打几下就死了&#xff01;即使受点磨难&#xff0c;只要能多经一些世事&#xff0c;死了也不后悔&#xff01; 漏洞…

NodeJS原型链污染ctfshow_nodejs

文章目录 NodeJS原型链污染&ctfshow_nodejs前言0x01.原型与原型链0x02.prototype和__proto__分别是什么&#xff1f;0x03.原型链继承不同对象的原型链* 0x04.原型链污染原理0x05.merge()导致原型链污染0x06.ejs模板引擎RCEejs模板引擎另一处rce 0x07.jade模板引擎RCE【ctfs…

使用RecyclerView构建灵活的列表界面

使用RecyclerView构建灵活的列表界面 1. 引言 在现代移动应用中&#xff0c;列表界面是最常见的用户界面之一&#xff0c;它能够展示大量的数据&#xff0c;让用户可以浏览和操作。无论是社交媒体的动态流、商品展示、新闻列表还是任务清单&#xff0c;列表界面都扮演着不可或…

Vue2 第二十节 vue-router (四)

1.全局前置路由和后置路由 2.独享路由守卫 3.组件内路由守卫 4.路由器的两种工作模式 路由 作用&#xff1a;对路由进行权限控制 分类&#xff1a;全局守卫&#xff0c;独享守卫&#xff0c;组件内守卫 一.全局前置路由和后置路由 ① 前置路由守卫&#xff1a;每次路由…

开箱报告,Simulink Toolbox库模块使用指南(二)——MATLAB Fuction模块

文章目录 前言 MATLAB Fuction模块 采样点设置 FFT 求解 分析和应用 总结 前言 见《开箱报告&#xff0c;Simulink Toolbox库模块使用指南&#xff08;一&#xff09;——powergui模块》 MATLAB Fuction模块 MATLAB Fuction模块是在Simulink建模仿真或生成代码时&#x…

Vue中监听路由参数变化的几种方式

目录 一. 路由监听方式&#xff1a; 通过 watch 进行监听 1. 监听路由从哪儿来到哪儿去 2. 监听路由变化获取新老路由信息 3. 监听路由变化触发方法 4. 监听路由的 path 变化 5. 监听路由的 path 变化, 使用handler函数 6. 监听路由的 path 变化&#xff0c;触发method…

无锚框原理 TOOD:Task-aligned One-stage Object Detection

无锚框原理 TOOD&#xff1a;Task-aligned One-stage Object Detection 一 摘要二 引言TOOD设计 三 具体设计Task-aligned Head任务对齐的预测器 TAP预测对齐 TAL 任务对齐学习Task-aligned Sample Assignment多任务损失 一 摘要 一阶段目标检测通常通过优化两个子任务来实现&…

CSS中所有选择器详解

文章目录 一、教学视频二、基础选择器1.标签选择器2.类选择器3.id选择器4.通配符选择器 三、复合选择器1.交集选择器2.并集选择器 四、属性选择器1.[属性]2.[属性属性值]3.[属性^属性值]4.[属性$属性值]5.[属性*属性值] 五、关系选择器1.父亲>儿子2.祖先 后代3.兄弟4.兄~弟 …

Mermaid系列之FlowChart流程图

一.欢迎来到我的酒馆 介绍mermaid下&#xff0c;Flowchat流程图语法。 目录 一.欢迎来到我的酒馆二.什么是mermiad工具三.在vs code中使用mermaid四.基本语法 二.什么是mermiad工具 2.1 mermaid可以让你使用代码来创建图表和可视化效果。mermaid是一款基于javascript语言的图表…

Vue2 第二十一节 Vue UI组件库

移动端常用UI组件 1. Vant https://youzan.github.io/vant 2. Cube UI https://didi.github.io/cube-ui 3. Mint UI http://mint-ui.github.io PC端常用UI组件 1. Element UI https://element.eleme.cn 2. IView UI https://www.iviewui.com 一. Element UI 的引入和使…