揭秘数据库性能飞跃的秘密:深入理解索引与执行计划的艺术

  •  作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注
  •  座右铭:   云端筑梦,数据为翼,探索无限可能,引领云计算新纪元
  •  个人主页:团儿.-CSDN博客

目录

前言:

正文:

一.索引

1. 索引的作用

2. 索引的分类(算法) **

3. BTREE索引算法演变(了解) ***

二.Btree索引功能上的分类

1.聚集索引(唯一性) ***

2.辅助索引(多个) ***

3.聚集索引和辅助索引的区别 *****

三.辅助索引细分

四.索引的命令操作

1.查询索引

2.创建索引

单列的辅助索引:

多列的联合索引:

唯一索引:

前缀索引

3.删除索引

五.压力测试准备:

1.未做优化前压测

2.索引优化后

六.执行计划分析

1.作用

2.获取执行

3.分析执行计划

3.1 table        

3.2 type

全表扫描: ALL

索引扫描:

4.添加索引:

5.index: 全索引扫描

6.range: 索引范围扫描(> < >= <= , between and ,or,in,like )

7.ref: 辅助索引等值查询

eq_ref :

const(system) :


前言:

在这个信息化的时代,掌握数据库的知识就像是掌握了打开宝藏的钥匙。

索引和执行计划作为数据库管理的重要工具,能够帮助我们高效地组织和检索数据。

通过深入了解这两者的工作原理及其在实际应用中的优化方法,我们可以显著提升数据库的性能表现。

今天,我们就来聊聊MySQL数据库中的索引和执行计划,以及如何利用它们的优化功能。


正文:

一.索引

1. 索引的作用

类似于一本书中的目录,通过索引可以快速定位到数据具体的物理存储位置,起到优化查询的作用

2. 索引的分类(算法) **

B树    

默认使用的索引类型(原型:平衡二叉树算法)

R树

Hash

FullText

GIS 索引

3. BTREE索引算法演变(了解) ***

B- 叶子节点无水平指针

B+

叶子节点有水平指针,可以方便范围查询

B*

枝节点有水平指针,mysql当前默认


二.Btree索引功能上的分类

1.聚集索引(唯一性) ***

(1)MySQL 会自动选择主键作为聚集索引列,没有主键会选择唯一键,如果都没有会生成隐藏的.

(2)MySQL进行存储数据时,会按照聚集索引列值的顺序,有序存储数据行

(3)聚集索引直接将原表数据页,作为叶子节点,然后提取聚集索引列向上生成枝和根

2.辅助索引(多个) ***

(1) 提取索引列的所有值,进行排序

(2) 将排好序的值,均匀的存放在叶子节点,进一步生成枝节点和根节点

(3) 在叶子节点中的值,都会对应存储主键ID

3.聚集索引和辅助索引的区别 *****

(1) 表中任何一个列都可以创建辅助索引,在你有需要的时候,只要名字不同即可

(2) 在一张表中,聚集索引只能有一个,一般是主键.

(3) 辅助索引,叶子节点只存储索引列的有序值+聚集索引列值.

(4) 聚集索引,叶子节点存储的时有序的整行数据.

(5) MySQL 的表数据存储是聚集索引组织表,辅助索引查询表。

注:mysql的查询过程就是通过辅助索引找到主键索引的id号,再通过主键索引查数据行


三.辅助索引细分

单列辅助索引

联合索引(覆盖索引) *****

唯一索引


四.索引的命令操作

1.查询索引

desc city;

PRI   ==> 主键索引

MUL   ==> 辅助索引

UNI   ==> 唯一索引

show index from city\G(\G行转列)

2.创建索引

单列的辅助索引:

alter table city add index idx_name(name);

show index from city\G

多列的联合索引:

alter table city add index idx_c_p(countrycode,population);

show index from city\G

唯一索引:

alter table city add unique index uidx_dis(district);

注:有联合索引无法创建唯一索引

select count(district) from city;

select count(distinct district) from city;

前缀索引

alter table city add index idx_dis(district(5));

show index from city\G

3.删除索引

alter table city drop index idx_name;

alter table city drop index idx_c_p;

alter table city drop index idx_dis;

五.压力测试准备:

source /tmp/t100w.sql

1.未做优化前压测

mysqlslap --defaults-file=/etc/my.cnf \

--concurrency=100 --iterations=1 --create-schema='world' \

--query="select * from t100w where k2='MN89'" engine=innodb \

--number-of-queries=200 -uroot -verbose

2.索引优化后

创建k2列索引:

alter table t100w add index idx_k2(k2);

再次并发测试:

mysqlslap --defaults-file=/etc/my.cnf \

--concurrency=100 --iterations=1 --create-schema='world' \

--query="select * from t100w where k2='MN89'" engine=innodb \

--number-of-queries=200 -uroot -verbose


六.执行计划分析

1.作用

将优化器 选择后的执行计划 截取出来.便于管理管判断语句得执行效率

2.获取执行

desc   SQL语句

explain SQL 语句

mysql>

desc select * from t100w where k2='MN89';

3.分析执行计划

3.1 table        

表名

3.2 type

查询的类型:

全表扫描: ALL
索引扫描:

index 全索引扫描

range 范围

ref 等值

eq_ref 联合等值

const(system) 主键等值

NULL 没有索引

4.添加索引:

use world

desc city;

alter table city add index idx_c_p(countrycode,population);

5.index: 全索引扫描

desc select countrycode  from city;

desc select countrycode from city where countrycode='CHN' and population>5000000;

6.range: 索引范围扫描(> < >= <= , between and ,or,in,like )

desc select * from city where id>2000;

desc select  * from city where countrycode like 'CH%';

对于辅助索引来讲,!= 和not in等语句是不走索引的

对于主键索引列来讲,!= 和not in等语句是走range


 

desc select  * from city where countrycode='CHN' or countrycode='USA';

desc select  * from city where countrycode in ('CHN','USA');

一般改写为 union all

desc

select  * from city where countrycode='CHN'

union all

select  * from city where countrycode='USA';

7.ref: 辅助索引等值查询

desc

select  * from city where countrycode='CHN'

union all

select  * from city where countrycode='USA';

eq_ref :

多表连接时,子表使用主键列或唯一列作为连接条件

A join B

on a.x = B.y

desc select b.name,a.name ,a.population  

from city as a

join country as b

on a.countrycode=b.code

where a.population<100;

const(system) :

主键或者唯一键的等值查询

desc select * from  city where id=100;


期待您的关注~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值