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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 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的值越大越好


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
14天前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
|
2月前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
2月前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
65 3
Mysql(4)—数据库索引
|
28天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
155 1
|
2月前
|
存储 关系型数据库 MySQL
如何在MySQL中进行索引的创建和管理?
【10月更文挑战第16天】如何在MySQL中进行索引的创建和管理?
72 1
|
2月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
70 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
2月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
109 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
29天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
65 0
|
2月前
|
监控 关系型数据库 MySQL
mysql8索引优化
综上所述,深入理解和有效实施这些索引优化策略,是解锁MySQL 8.0数据库高性能查询的关键。
46 0
|
2月前
|
SQL 关系型数据库 MySQL
美团面试:mysql 索引失效?怎么解决? (重点知识,建议收藏,读10遍+)
本文详细解析了MySQL索引失效的多种场景及解决方法,包括破坏最左匹配原则、索引覆盖原则、前缀匹配原则、`ORDER BY`排序不当、`OR`关键字使用不当、索引列上有计算或函数、使用`NOT IN`和`NOT EXISTS`不当、列的比对等。通过实例演示和`EXPLAIN`命令分析,帮助读者深入理解索引失效的原因,并提供相应的优化建议。文章还推荐了《尼恩Java面试宝典》等资源,助力面试者提升技术水平,顺利通过面试。