Mysql索引实战

news2024/11/25 14:58:48

Mysql索引实战

  • 一:概述
    • 1.1 索引如何提高查询效率:
  • 二:结构
    • 2.1 主要索引结构
    • 2.2 详解B+Tree
      • 2.2.1 二叉树
      • 2.2.2 红黑树
      • 2.2.3 B-Tree
      • 2.2.4 B+Tree
      • 2.2.5 为什么InnoDB存储引擎选择使用B+tree索引结构?
  • 三:索引分类
    • 3.1 按照作用分
    • 3.2 按照存储形式分
    • 3.3 什么是回表查询
  • 四:索引语法
    • 4.1 创建索引
    • 4.2 查看索引
    • 4.3 删除索引
  • 五:SQL性能分析
    • 5.1 SQL执行频率
    • 5.2 慢SQL日志
    • 5.3 profile性能分析
    • 5.4 Explain执行计划
  • 六:索引使用
    • 6.1 最左前缀法则
    • 6.2 范围查询
    • 6.3 索引列的运算操作
    • 6.4 字符串不加 ' '
    • 6.5 模糊查询
  • 七:索引使用原则
    • 7.1 or连接的条件
    • 7.2 sql提示
    • 7.3 覆盖索引

一:概述

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

1.1 索引如何提高查询效率:

在这里插入图片描述

二:结构

2.1 主要索引结构

  1. B+Tree索引
    最常见的索引类型,大部分引擎都支持B+树索引
  2. Hash索引
    底层数据结构是用哈希表实现的,只有精确匹配索引列的查询才有效不支持范围查询
  3. R-tree(空间索引)
    空间索引是MYISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少
  4. Full-text(全文索引)
    是一种通过建立倒排索引,快速匹配文档的方式。类似于Lucene,Sol,ES

2.2 详解B+Tree

B+Tree作为innodb引擎最常用的存储结构,是我们本次要讲解的重点。
想要了解B+Tree,我们将会从二叉树、红黑树、B-Tree、B+Tree的顺序,逐渐的进行分析,从而带大家深入了解B+Tree。

2.2.1 二叉树

这里我们不对二叉树基础概念进行讲解,主要说二叉树存储时存在的问题
在这里插入图片描述
图中给出了两个二叉树,如果插入的数据非常不平衡的话,例如顺序插入、将会形成一个链表,查询的性能大大降低,

2.2.2 红黑树

在这里插入图片描述
为了解决数据不平衡的问题,出现了红黑树,红黑树的节点是不断变化的,可以做到数据平衡,不会产生数据非常不平衡的问题。

2.2.3 B-Tree

B-Tree又叫做多路平衡查找树。
一颗最大度为 5阶的B-Tree为例(每个节点最多存储4个key,5个指针)
在这里插入图片描述
B-Tree分裂的方式是向上分裂,当满足对应阶数在进行插入数据的时候,会将中间的数据向上分裂。
具体可以查看结构变化

2.2.4 B+Tree

以一颗最大度数(max-degree)为4(4阶)的b+tree为例:
在这里插入图片描述

  1. 所有的元素都存储到叶子节点
  2. 所有的叶子节点形成了一个单向链表

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

2.2.5 为什么InnoDB存储引擎选择使用B+tree索引结构?

  1. 相对于二叉树,层级更少,搜索效率高;
  2. 对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一
    页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的
    高度,导致性能降低;B+tree由于每次都是去叶子节点上查找数据,更加的稳定。
  3. 相对Hash索引,B+tree支持范围匹配及排序操作;

三:索引分类

3.1 按照作用分

按照作用可以分为4种,分别是

分类含义特点关键字
主键索引针对于表中主键创建的索引默认自动创建,只能有一个PRIMARY
唯一索引避免同一个表中某数据列中的值重复可以有多个UNIQUE
常规索引快速定位特定数据可以有多个NORMAL
全文索引全文索引查找的是文本中的关键词,而不是比较索引中的值可以有多个FULLTEXT

3.2 按照存储形式分

分类含义特点
聚集索引将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据必须有,而且只有一个
二级索引索引将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键可以有多个

在这里插入图片描述

3.3 什么是回表查询

已上面的聚集索引和二级索引为例:
select from user where name =‘Arm’;
当我们执行这条sql的时候,会先去二级索引找到对应的主键索引值,然后通过这个索引值去聚集索引内查询对应的数据,这个过程就叫做回表查询。

四:索引语法

4.1 创建索引

CREATE UNIQUE FULLTEXT INDEX index_name ON table_name (index_col_name,...)

4.2 查看索引

SHOW INDEX FROM table name

4.3 删除索引

DROP INDEX index name ON table name

五:SQL性能分析

5.1 SQL执行频率

MySQL客户端连接成功后,通过show[session]global]status命令可以提供服务器状态信息。通过如下指令,可以查看当前表

INSERT、UPDATE、DELETE、SELECT的访问频次:
SHOW GLOBAL STATUS LIKE ‘Com_____’

5.2 慢SQL日志

慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。
MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

#查看是否已经开始慢查询日志
show variables like 'slow_query_log'
#开启MySQL慢日志查询开关
slow_query_log=1
#设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time=2

5.3 profile性能分析

show profiles能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。

# 查看是否开启
SELECT @@have profiling
# 默认orofiling:是关闭的,可以通过set语句在session/global级别开启profiling:
SET profiling =1;
# 查看每一条SQL的耗时基本情况
show profiles;
#查看指定query id的SQL语句各个阶段的耗时情况
show profile for query query id;
#查看指定query id的SQL语句CPU的使用情况
show profile cpu for query query_id;

5.4 Explain执行计划

通过Explain性能分析博客
之前对Explain进行过研究,并且写了总结博客,大家可以查看这篇博客。

六:索引使用

6.1 最左前缀法则

如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。
如果跳跃某一列,索引将部分失效(后面的字段索引失效)

6.2 范围查询

联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效

6.3 索引列的运算操作

不要在索引列上进行运算,会使索引失效

6.4 字符串不加 ’ ’

字符串不加 ’ ’ 存在类型转换,会使索引失效

6.5 模糊查询

如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效

七:索引使用原则

7.1 or连接的条件

用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到

7.2 sql提示

  • use index: 建议
    explain select*from tb user use index(idx user pro)where profession=‘软件工程’:
  • ignore index: 忽略
    explain select*from tb_user ignore index(idx_user_pro)where profession=软件工程’
  • force inde: 强制
    explain select*from tb_user force index(idx_user_pro)where profession=‘软件工程’

7.3 覆盖索引

尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到),减少select*。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/753985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用fast测试的错误

错误&#xff1a;Connection refused: connect 分析&解决 检查服务的端口号和fast生成请求时的端口号是否一致&#xff0c;不一致会报上面的错误 分析&#xff1a;设置服务配置的方法很多&#xff0c;可以写在配置文件里&#xff0c;也可以写在命令行里&#xff0c;当有多…

windows nodejs 版本切换

一、按健winR弹出窗口&#xff0c;键盘输入cmd,然后敲回车。然后进入命令控制行窗口&#xff0c;并输入where node查看之前本地安装的node的路径。 二、找到上面找到的路径&#xff0c;将node.exe所在的父目录里面的所有东西都删除。 三、从官网下载安装包 https://github.com/…

轻量级性能测试工具 wrk 应该如何使用?

项目设计之初或者是项目快要结束的时候&#xff0c;大佬就会问我们&#xff0c;这个服务性能测试的结果是什么&#xff0c;QPS 可以达到多少&#xff0c;RPS 又能达到多少&#xff1f;接口性能可以满足未来生产环境的实际情况吗&#xff1f;有没有自己测试过自己接口的吞吐量&a…

MongoDB安装配置教程(详细版)

前言&#xff1a;MongoDB是前端开发人员普遍使用的数据库&#xff0c;因为MongoDB不需要图形界面&#xff0c;是一个基于分布式文件存储的开源数据库系统。MongoDB 将数据存储为一个文档&#xff0c;数据结构由键值对(key>value)组成&#xff1b;MongoDB 文档类似于 JSON 对…

Flutter:自定义错误显示

为什么要自定义错误处理 以下面数组越界的错误为例&#xff1a; class _YcHomeBodyState extends State<YcHomeBody> {List<String> list [苹果, 香蕉];overrideWidget build(BuildContext context) {return Center(child: Column(children: [Text(list[0]),Tex…

小区物业管理信息系统设计与实现(论文+源码)

小区物业管理信息系统设计与实现(论文源码) 本篇 论文源码私我 以上内容只是精简版 还有很多原创类型论文 摘 要 随着互联网的发展&#xff0c;网络技术的发展变得极其重要&#xff0c;所以依靠计算机处理业务成为了一种社会普遍的现状。管理方式也自然而然的向着现代化技术方…

python_day8_timeline

带时间线的柱状图 导包 from pyecharts.charts import Bar, Timeline from pyecharts.options import * from pyecharts.globals import *创建柱状图1 bar1 Bar() bar1.add_xaxis([中国, USA, 不列颠]) bar1.add_yaxis(GDP, [30, 20, 10],label_optsLabelOpts(position&quo…

【Linux详解】——文件系统(磁盘结构、软硬链接、动静态库)

&#x1f4d6; 前言&#xff1a;本期介绍文件系统。 目录 &#x1f552; 1. 磁盘结构&#x1f558; 1.1 物理结构&#x1f558; 1.2 存储结构&#x1f558; 1.3 逻辑结构 &#x1f552; 2. 文件系统&#x1f558; 2.1 对 IO 单位的优化&#x1f558; 2.2 磁盘分区与分组&#x…

一套电子病历系统源码(EMR)

EMR电子病历系统源码 电子病历系统面向门诊医生和病房临床医生&#xff0c;实现了医生日常阅读、书写病历和医院管理病历的需求&#xff0c;它包括知识库管理、病历模版制作、医生书写病历、开各种检查检验申请单、查询各种报告单、电子病历浏览、病历质量控制等功能。 它将病…

JMeter基础 — JMeter聚合报告详解

提示&#xff1a;聚合报告组件的使用和察看结果树组件的使用方式相同。本篇文章主要是详细的介绍一下聚合报告组件内容&#xff0c;不做示例演示。 1、聚合报告介绍 在使用JMeter进行性能测试时&#xff0c;聚合报告(Aggregate Report)可以说是必用的监听器。 &#xff08;1&…

【微信小程序创作之路】- 小程序窗口整体配置(导航栏、标题)

【微信小程序创作之路】- 小程序窗口导航栏配置 第五章 微信小程序窗口导航栏配置 文章目录 【微信小程序创作之路】- 小程序窗口导航栏配置前言一、入口文件的配置二、页面配置三、全局默认窗口配置1.navigationBarTitleText&#xff1a;导航栏标题文字2.navigationBarBackgr…

基于ChatGPT上线《你说我猜》小游戏

摘要 AIGC、GPT、休闲小游戏三者可以怎么结合&#xff1f; AIGC、GPT与小游戏的结合为游戏体验带来了新的可能性。AIGC&#xff08;Artificial Intelligence Game Content&#xff09;作为一种人工智能技术&#xff0c;可以自动生成任务、剧情和角色对话等游戏元素&#xff0c…

安卓:Fragment

一、Fragment介绍 Fragment 是 Android 平台上的一种 UI 组件&#xff0c;用于构建灵活且可复用的界面模块。每个 Fragment 都有自己的生命周期&#xff0c;可以嵌入到 Activity 中&#xff0c;并在一个 Activity 内部管理其自己的布局和行为。通过使用 Fragment&#xff0c;可…

1000多道大厂Java真题汇总。刷完这一套高质量题集,这个金九银十妥妥的

又是一年金九银十&#xff01; 纵观今年的技术招聘市场&#xff0c;Java依旧是当仁不让的霸主&#xff01;即便遭受Go等新兴语言不断冲击&#xff0c;依旧岿然不动。究其原因&#xff1a; Java有着极其成熟的生态&#xff0c;这个不用我多说&#xff1b;Java在运维、可观测性…

el-table实现动态表头,自定义斑马纹等功能

需求&#xff1a;1.根据选择的日期时间&#xff0c;实现表头的动态显示功能 2.修改默认表头灰色样式&#xff0c; 3.斑马纹偶数灰色改为奇数为灰色 4.表格某一行加分割线区分 1.效果 2.动态表格实现 1.height&#xff1a;表格的高度设置&#xff0c;内容超出后会显示滚动条&a…

类和对象(二)

目录 一、类的六个默认成员函数 二、构造函数 2.1 概念 2.2 特性 三、析构函数 3.1 概念 3.2 特性 四、拷贝构造函数 4.1 概念 4.2 特性 五、赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载特性 六、const修饰成员函数 七、取地址及const取地址操作符重载 一…

Html基础知识学习——css精灵(十五)

这里写自定义目录标题 定义示例一示例二 定义 将网页用到的图片放在一张图片上&#xff0c;进行定位展示 优点:防止网页http请求次数过多&#xff0c;从而提高页面性能 缺点&#xff1a;降低开发效率。维护难度加大 示例一 使用图 网页制作图 <!DOCTYPE html> <…

如何能够极速浏览大体积tif影像文件?

在无人机航拍的高清正射影像中&#xff0c;大体积文件是普遍现象&#xff0c;几十GB的TIFF文件很常见。常规的浏览方式特别容易导致卡顿&#xff0c;用户需要花费半天时间等待影像图的呈现。 建议您尝试将tiff格式快速转换为mbtiles或lrp格式&#xff0c;mbtiles和lrp格式专门…

JSP+MySql实战

0目录 JSPMySql实战 创建maven工程和包 创建2张表 User表 Employee表 实体类封装 Util 包BaseDao类 Dao包 EmployeeDao类 UserDao类 实现接口方法 Dao包新建impl包 UserDaoImp EmployeeDaoImpl 新建Service包 接口方法 UserService EmployeeSe…

【分布式任务调度】XXL-JOB的任务调度实现原理(四)

文章目录 1.前言2.调度中心流程2.1.任务配置扫描流程2.2.计算任务触发时机2.2.1.已超时5秒以上2.2.2.超时未超过5秒2.2.3.还未到触发时间 2.3.任务触发流程2.3.1.任务触发线程池2.3.2.参数处理2.3.3.任务触发2.3.4.分片广播策略&#xff08;补充&#xff09; 3.执行器流程3.1.任…