索引优化1|学习笔记

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 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 还是一个,这就用到的是全值匹配的部分使用,这是因为最佳左前缀法则不能跳过索引中的列。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
存储 SQL 关系型数据库
mysql优化一
mysql优化一
34 0
|
索引
索引优化
索引优化
361 0
|
4月前
|
缓存 监控 关系型数据库
mysql优化
【6月更文挑战第12天】mysql优化
42 3
|
5月前
|
监控 关系型数据库 MySQL
MySQL优化器
MySQL优化器
|
SQL 前端开发 关系型数据库
索引优化|学习笔记
快速学习索引优化
108 0
索引优化|学习笔记
|
关系型数据库 MySQL 开发者
索引优化5|学习笔记
快速学习索引优化5
索引优化5|学习笔记
|
存储 关系型数据库 MySQL
索引优化3|学习笔记
快速学习索引优化3
索引优化3|学习笔记
|
SQL 关系型数据库 MySQL
索引优化7|学习笔记
快速学习索引优化7
索引优化7|学习笔记
|
关系型数据库 MySQL 开发者
索引优化9|学习笔记
快速学习索引优化9
索引优化9|学习笔记
|
SQL 关系型数据库 MySQL
索引优化4|学习笔记
快速学习索引优化4
索引优化4|学习笔记