索引优化1|学习笔记

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 快速学习索引优化1

开发者学堂课程【MySQL 高级应用 - 索引和锁索引优化1】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/598/detail/8613


索引优化1


内容介绍

一、建表

二、索引优化


一、建表

首先我们建表:

CREATETABLE  staffs(

id INT PRIMARY KEY AUTO _INCREMENT,

NAME VARCHAR (24) NOT NULL DEFAULT "COMMENT'姓名'

age INT NOT NULL DEFAULT 0 COMMENT '年龄',

pos VARCHAR (20) NOT NULL DEFAULT "COMMENT'职位',

add_time  TIMESTAMP NOT NULL DEFAULT CURRENT _ TIMESTAMP COMMENT '入职时间"

) CHARSETutf8COMMENT '员工记录表';

INSERT INTO staffs(NAME, age, pos, add _ time)VALUES('z3',22,'manager'NOW());

INSERT  INTO staffs(NAME, age, pos, add _ time)VALUES('July', 23, 'dev'NOW());

INSERT INTO  staffs(NAME, age, pos, add _ time)VALUES('2000', 23, 'dev',NOW());

SELECT*FROM staffs;

ALTER TABLE Staff ADD INDEX idx_staffs _ nameAgePos (name, age, pos);

我们复制输入后得到:

image.png


二、索引优化

有表后我们开始,下面是10条是索引失效的案例:

1.全值匹配我最爱。

2.最佳左前缀法则。

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

4.存储引擎不能使用索引中范围条件右边的列。

5.尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少 select*

6. mysql 在使用不等于(=或者<>)的时候无法使用索引会导致全表扫描。

7. is nullis not null 也无法使用索引。

8. like以通配符开头('%abc.... 'mysql 索引失效会变成全表扫描的操作。

9.字符串不加单引号索引失效。

10.少用 or,用它来连接时会索引失效。

11.全值匹配我最爱

我们输入mysql>show index from staffs

得到:

image.png

我们看到现在有一定的顺序,是因为我们建表时已加上复合索引 staffs,我们建了三个表 NAMEagepos,这时我们继续输入:

mysql> EXPLAIN SELECT * FROM staffs WHERE NAME ='July;

我们得到:

image.png

全值匹配是个数+顺序,我们用到其中一个表,这时是不会失效的,我们继续:

mysql> EXPLAIN SELECT  *  FROM staffs WHERE NAME ='July' AND age=25;

得到:

image.png

现在我们 ref 有两个 const,此时用到两个表,同样未失效我们继续:

mysql> EXPLAIN SELECT  *  FROM staffs WHERE NAME ='July' AND age=25 AND pos='dev'

结果如下:

image.png

我们发现三表载入都没有失效,接着我们看:

输入:mysql> SELECT  *  FROM staffs

得知 age 的值是23,继续输入:

mysql> EXPLAIN SELECT  *  FROM staffs WHERE age=23 AND pos='dev'

得到:

image.png

此时索引失效,type 成了 all,换一种:

mysql> EXPLAIN SELECT  *  FROM staffs WHERE pos='dev'

我们看:

image.png

依然如此,我们继续:

mysql> EXPLAIN SELECT * FROM staffs WHERE NAME ='July;

这时我们就回到开始只用到 NAME,发现:

image.png

并未失效,我们发现我们跳过了 NAME,从agepos 开始,就会失效,因为他违背了最佳左前缀法则。

2.最佳左前缀法则。

如果索引了多列。查询从索引的最左前列开始并且不能跳过索引中的列。我们看上面所建的表,NAMEageposNAME 就是最左前列,若没有他,索引就会失效。

此时看:

mysql> EXPLAIN SELECT  *  FROM staffs WHERE NAME ='July' AND pos='dev'

取出了 age ,结果如下:

image.png

此时索引未失效,但 const 还是一个,这就用到的是全值匹配的部分使用,这是因为最佳左前缀法则不能跳过索引中的列。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
127
分享
相关文章
PubMedBERT:生物医学自然语言处理领域的特定预训练模型
今年大语言模型的快速发展导致像BERT这样的模型都可以称作“小”模型了。Kaggle LLM比赛LLM Science Exam 的第四名就只用了deberta,这可以说是一个非常好的成绩了。所以说在特定的领域或者需求中,大语言模型并不一定就是最优的解决方案,“小”模型也有一定的用武之地,所以今天我们来介绍PubMedBERT,它使用特定领域语料库从头开始预训练BERT,这是微软研究院2022年发布在ACM的论文。
419 1
通过实验深入了解 TCP 数据的发送和接收
本系列文章是组内写给新人和实习生的 TCP入门系列教程,结合了理论和实践,本篇为第二篇,建议先读上篇《通过实验深入了解TCP 连接的建立和关闭》。
构建未来:云原生技术在企业数字化转型中的关键角色
【5月更文挑战第25天】 随着数字浪潮的不断涌动,企业面临着前所未有的转型压力与机遇。本文深入探讨了云原生技术如何成为推动企业数字化革新的核心力量,剖析其提高业务敏捷性、优化资源利用和加强系统可靠性的机制。通过具体案例分析,揭示了云原生架构和服务在支持动态环境、降低运营成本及促进持续交付方面的独特优势。文章旨在为企业决策者提供一个关于云原生技术投资和应用的全景式视角,以助力他们在数字化道路上稳步前行。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问