15天学习MySQL计划-索引(进阶篇)第七天(上)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 15天学习MySQL计划-索引(进阶篇)第七天

索引

1.索引概述

1.介绍

索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

原理图


 c4402fb307684141bb5c3995957a6cf8.png

2.优缺点

image.png

2.索引结构

MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要包括一下几种:

image.png

常见存储引擎的支持表格

image.png

1.二叉树


278b8c97c2c54c5ba76419d7659f63b0.png



二叉树缺点:顺序插入时,会形成一个链表,查询性能大大降低。大数据量情况下,层级较深,检索速度慢。


红黑树:大数据量情况下,层级较深,检索速度慢


2.B-Tree(多路平衡查找数)


以一颗最大度数(max-degree)为5(5阶)的b-tree为例(每个节点最多存储4个key,5个指针)

105447ae81ac4ec58fec6656931f96af.png



2c78a3af30f14ee0a11b46704deef338.png


3.B+Tree


以一颗最大度数(max-degree)为4(4阶)的b+tree为例


MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能



d90c2d77a0ce44098209cd91fec54192.png


4.hash


哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中。


如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可以通过链表来解决


8b103ad13a0d4eddb2fb92fee00cc6d9.png



hash的特点


hash索引只能用于对等比较(=,in),不支持范围查询(between,>,<)


无法利用索引完成排序操作


查询效率高,通常只需要一次检索就可以了,效率通常要高于B+Tree索引


存储引擎支持


在MySQL中,支持hash索引的是memory引擎,而innodb中具有自适应hash功能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的。


3.索引分类

image.png

在innodb存储引擎中,根据索引的存储形式,又可以分为以下两种:


image.png


聚集索引选取规则:


如果存在主键,主键索引就是聚集索引。


如果不存在主键,将使用第一个唯一(uniqe)索引作为聚集索引


如果表没有主键,或没有合适的唯一索引,则innodb会自动生成一个rowid作为隐藏的聚集索引。


查询的过程


首先查询name为Arm的列的所有信息,在查询name时需要在二级索引进行查找,在二级索引找到对应的name之后,通过二级索引提供的主键ID,然后进行回表到聚焦索引进行查找,进行返回所有的信息。


736ee4a7426244e6963a22020cb279e5.png



4.索引语法

1.创建索引


create [unique|fulltext] index index_name on table_name (index_col_name,...);

2.查看索引


show index from table_name;

3.删除索引


drop index index_name on table_name;

4.查询内容


#正常查询

explain select * fron where 索引字段='内容'

#全文索引查

select * from where match(字段) against(查询值);

explain select * from where match(字段) against(查询值);

5.SQL性能分析

1.sql执行频率


MySQL客户端连接成功后,通过show [session|global] status 命令可以提供服务器状态信息。通常如下指令,可以查看当前数据库的insert,update,delete,select的访问频次


show global status like 'com_______';   #七个下划线

2.慢查询日志


慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。


MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:


#开启MySQL慢日志查询开关

slow_query_log=1

#设置慢日志的时间为2秒,sql语句执行时间超过2秒,就会视为慢查询,记录慢查询日志

long_query_time=2

配置完毕之后,重启MySQL服务器进行测试,查看慢日志文件中记录的信息/var/lib/mysql/localhost-slow.log。


3.profile详细


show profile 能够在sql优化时帮助我们了解时间都耗费到哪里去了。通过have_profile参数,能够看到当前MySQL是否支持profile操作:


select @@have_profiling;

默认profiling是关闭的,可以通过set语句在session/global级别开启profiling:


set profiling=1;

执行一系列的业务sql的操作,然后通过如下指令查看指令的执行耗时:


#查看每一条SQL的耗时基本情况

show profiles;

#查看指定query_id的SQL语句各个阶段的耗时情况

show profile for query query_id;

#查看指定query_id的SQL语句CPU的使用情况

show profile cpu for query query_id;


4.explain执行计划


explain或者desc命令获取MySQL如何执行select语句的信息,包括在select语句执行过程中表如何连接和连接的顺序。


语法:


#直接在select语句之前加上关键字explain/desc

explain select 字段 from 表名 where 条件;


7906e273e4b240e78ea8c277ffbb1446.png


explain执行计划各字段含义:


id


select查询的序列号,表示查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行)。


select_type


表示select的类型,常见的取值有simple(简单表,既不使用表连接或者子查询),primary(主查询,即外层的查询),union(union中的第二个或者后面的查询语句),subquery(select/where之后包含了子查询)等


type


表示连接类型,性能由好到差的连接类型为:null--》system--》const--》eq_ref--》ref--》range--》index--》all。


possible_key


显示可以应用在这张表上的索引,一个或多个。


key


实际使用的索引,如果为null,则没有使用索引


key_len


表示索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,在不损失精准性的前提下,长度越短越好。


rows


MySQL认为必须要执行查询的行数,在innodb引擎的表中,是一个估计值,可以并不总是准确的。


filtered


表示返回结果的行数占需读取行数的百分比,filtered的值越大越好


相关实践学习
如何快速连接云数据库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
45
分享
相关文章
MySQL索引学习笔记
本文深入探讨了MySQL数据库中慢查询分析的关键概念和技术手段。
315 80
Mysql的索引
MYSQL索引主要有 : 单列索引 , 组合索引和空间索引 , 用的比较多的就是单列索引和组合索引 , 空间索引我这边没有用到过 单列索引 : 在MYSQL数据库表的某一列上面创建的索引叫单列索引 , 单列索引又分为 ● 普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。 ● 唯一索引:索引列中的值必须是唯一的,但是允许为空值 ● 主键索引:是一种特殊的唯一索引,不允许有空值 ● 全文索引: 只有在MyISAM引擎、InnoDB(5.6以后)上才能使⽤用,而且只能在CHAR,VARCHAR,TEXT类型字段上使⽤用全⽂文索引。
MySQL底层概述—8.JOIN排序索引优化
本文主要介绍了MySQL中几种关键的优化技术和概念,包括Join算法原理、IN和EXISTS函数的使用场景、索引排序与额外排序(Using filesort)的区别及优化方法、以及单表和多表查询的索引优化策略。
104 22
MySQL底层概述—8.JOIN排序索引优化
MySQL索引有哪些类型?
● 普通索引:最基本的索引,没有任何限制。 ● 唯一索引:索引列的值必须唯一,但可以有空值。可以创建组合索引,则列值的组合必须唯一。 ● 主键索引:是特殊的唯一索引,不可以有空值,且表中只存在一个该值。 ● 组合索引:多列值组成一个索引,用于组合搜索,效率高于索引合并。 ● 全文索引:对文本的内容进行分词,进行搜索。
MySQL原理简介—9.MySQL索引原理
本文详细介绍了MySQL索引的设计与使用原则,涵盖磁盘数据页的存储结构、页分裂机制、主键索引设计及查询过程、聚簇索引和二级索引的原理、B+树索引的维护、联合索引的使用规则、SQL排序和分组时如何利用索引、回表查询对性能的影响以及索引覆盖的概念。此外还讨论了索引设计的案例,包括如何处理where筛选和order by排序之间的冲突、低基数字段的处理方式、范围查询字段的位置安排,以及通过辅助索引来优化特定查询场景。总结了设计索引的原则,如尽量包含where、order by、group by中的字段,选择离散度高的字段作为索引,限制索引数量,并针对频繁查询的低基数字段进行特殊处理等。
MySQL原理简介—9.MySQL索引原理
MySQL底层概述—6.索引原理
本文详细回顾了:索引原理、二叉查找树、平衡二叉树(AVL树)、红黑树、B-Tree、B+Tree、Hash索引、聚簇索引与非聚簇索引。
MySQL底层概述—6.索引原理
MySQL秘籍之索引与查询优化实战指南
最左前缀原则。不冗余原则。最大选择性原则。所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快!
135 22
 MySQL秘籍之索引与查询优化实战指南
浅入浅出——MySQL索引
本文介绍了数据库索引的概念和各种索引结构,如哈希表、B+树、InnoDB引擎的索引运作原理等。还分享了覆盖索引、联合索引、最左前缀原则等优化技巧,以及如何避免索引误用,提高数据库性能。
MySQL中为什么要使用索引合并(Index Merge)?
通过这些内容的详细介绍和实际案例分析,希望能帮助您深入理解索引合并及其在MySQL中的
196 10
【MYSQL】 ——索引(B树B+树)、设计栈
索引的特点,使用场景,操作,底层结构,B树B+树,MYSQL设计栈