MySQL数据库调优————索引调优技巧

news2024/9/30 1:41:21

长字段的索引调优

当某张表需要给一个长字段创建索引时,因为索引长度越长,效率越差,所以我们需要对其进行优化。

创建额外的长字段的Hash值列

当长字段需要创建索引时,我们可以为其创建额外的一列,用其Hash值作为值,在Hash值这一列上创建索引。例如,first_name这一字段长度很长,而它有常常作为where条件出现,我们就可以增加一列first_name_hash用first_name字段的值的hash值作为该列的值,可以用CRC32(first_name)赋值。然后在first_name_hash上创建索引。在选用hash算法时,第一考虑hash冲突的情况,第二要考虑hash计算后的长度。

使用前缀索引

上述方法,在进行全值查询时可用,但在进行模糊查询时则不适用,这时候我们可以使用前缀索引解决。

alter table employees add key(first_name(5));

first_name后的括号中的数字表示使用前几位作为索引,这个值多少合适,这时候我们需要进行完整列的选择性计算:

select count(distinct first_name)/count(*) from employees;

得到的值就是该字段的最大选择性了。
然后使用:

select count(distinct left(first_name,X))/count(*) from employees;

逐步增大X的值,直到达到最大选择性的值,那么这个时候的X的值,就是我们要选择的值了。

单列索引vs组合索引

在这里插入图片描述
from_date,to_date两个字段没有索引的情况下执行

select *
from salaries
where from_date = '1986-06-26'
and to_date = '1987-06-26';

执行时间为
在这里插入图片描述
然后分别为from_date和to_date创建索引
在这里插入图片描述
再次执行上面的SQL查询,时间为
在这里插入图片描述
删除单独索引,创建from_date和to_date的组合索引
在这里插入图片描述
执行时间为
在这里插入图片描述
总结:

  • SQL存在多个条件,多个单列索引,会使用索引合并
  • 如果出现索引合并,往往说明索引不够合理
  • 如果SQL暂时没有性能问题,可以暂时不进行调优
  • 使用组合索引时要注意列的顺序【要遵循最左前缀原则】

覆盖索引

对于索引X,SELECT的字段只需要从索引就能获得,而无需得到表数据里获取,这要的索引就叫覆盖索引。
现在salaries表有以下索引
在这里插入图片描述
执行

select *
from salaries
where from_date = '1986-06-26'
and to_date = '1987-06-26';

用时
在这里插入图片描述
当我们仅仅查询组合索引覆盖的字段时

select from_date,to_date
from salaries
where from_date = '1986-06-26'
and to_date = '1987-06-26';

用时
在这里插入图片描述
总结:
当查询时,使用到覆盖索引时,可以减少查询次数,从而提高查询效率。所以,在查询时尽量只返回想要的字段,这样第一有可能使用到覆盖索引提高查询效率,第二减少了网络传输的开销。

重复索引、冗余索引、未使用的索引

重复索引

  • 在相同的列上按照相同的顺序创建的索引
  • 尽量避免重复索引,如果发现存在重复索引应该删除

冗余索引

  • 如果已经存在索引index(A,B),又创建了index(A),那么index(A)就是index(A,B)的冗余索引
  • 一般要避免,但有特例!要避免掉进陷阱里!

示例,现在有表salaries表,索引情况如下:
在这里插入图片描述

存在单例索引emp_no,以及from_date单列索引。执行

explain
select *
from salaries
where from_date = '1986-06-26'
order by emp_no;

结果
在这里插入图片描述
这时候type为ref,Extra额外信息为空
修改索引如下:
在这里插入图片描述
有emp_no单列索引和from_date、to_date的组合索引
再次运行执行计划结果
在这里插入图片描述
虽然type还是ref,但是Extra的值为Using filesort,也就是说order by语句没有用到emp_no索引。
因为第一种情况可以视为使用了组合索引index(from_date,emp_no),所以在排序的时候可以用到索引,而第二种情况,可以当作使用了索引index(from_date,to_date,emp_no),因为跳过了to_date,根据最左前缀原则,emp_no索引是失效的,所以排序是filesort。

未使用的索引

在表中有时候会有提前创建的索引,但在后续的开发中发现并没有用到,那么这种未使用的索引就是累赘,因为维护索引也是要消耗性能,有时间成本的,所以对于这种索引要删除掉。

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

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

相关文章

如何利用Power Virtual Agents机器人实现成绩查询服务

今天我们继续介绍如何利用Power Virtual Agents来实现成绩查询服务。设计思路是在PVA聊天机器人的对话框中输入学生的姓名和学号来进行成绩的查询。首先,在Microsoft 365的OneDrive中制作一个Excel格式的成绩单。 可以将学生的学号、姓名、各学科成绩进行添加。 在P…

【初探人工智能】2、雏形开始长成

【初探人工智能】2、雏形开始长成【初探人工智能】2、雏形开始长成安装Flask封装Web接口雏形设置接收参数功能验证聊天写代码代码补全生成图片写在后面笔者初次接触人工智能领域,文章中错误的地方还望各位大佬指正! 【初探人工智能】2、雏形开始长成 在…

限时活动|凭徽章领披萨大奖,玩转Moonbeam治理论坛

动动手指,无需每天打卡,用刷手机的零碎时间领一份Web3惊喜! 本次挑战的目标是鼓励大家参与社区治理、熟悉论坛操作。有关参与方式和原因的信息在Twitter上共享:有兴趣可以和ThinkWildCrypto一起探索论坛以解锁其功能、了解最近和正…

【虹科干货】如何有效运用虹科任意波形发生器工作模式?

图 1:显示从存储器到输出的数据路径的 AWG 概念框图 01引言 任意波形发生器 (AWG) 的强大功能之一是它们可以生成几乎无限数量的波形。 AWG 的工作模式控制这些波形输出方式的时序。 在本应用说明中,我们将研究虹科Spectrum M4i.66xx 系列 AWG 工作模式…

JVM的GC机制和常见GC算法

文章目录[toc]1. 堆内存的分代2. GC分类3. 什么是GC3.1 需要GC的内存区域3.2 GC回收的对象3.3 判断对象存活的两种算法3.3.1 引用计数3.3.2 可达性分析3.4 什么时候触发GC4. 常见的GC算法4.1 标记-清除算法4.2 复制算法4.3 标记-压缩算法1. 堆内存的分代 堆中内存分为新生代和老…

String类 [上]

一、编码的基础介绍 编码:是信息从一种形式或格式转换为另一种形式的过程。 ASCLL 编码表:主要表示的是英文的编码表 Unicode:是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码二进制编码…

小白式linux系统怎么安装宝塔面板

有很多小白同学问我linux系统服务器怎么远程连接。那么今天我们重点来教教大家如何用电脑远程服务器配上图文教程,让不懂的新手小白一看就会,分分钟上手教程怎么安装宝塔面板?这个其实很简单接下来跟着我操作。以linux centos7.6 举例Centos安…

[计算机操作系统(慕课版)]第二章 进程的描述与控制(学习笔记)

2.1 前驱图和程序执行 2.1.1 前驱图 前驱图是指一个有向无循环图可记为DAG前驱图用于描述进程之间执行的先后顺序。前驱图的每个节点用来表示一个进程或程序段乃至一条语句节点间的有向边表示两个节点之间存在的偏序或前驱关系。进程或程序之间的前驱关系可用→来表示。如果进…

有了这些接口测试用例+工具,测试效率想不提升都难

写在前面:在日常开发过程中,有人做前端开发,有人负责后端开发。接口的主要作用就是连接前后台。但是,由于前端和后端开发的速度可能不一样,尤其是后端开发好了,但前端还未开发。这种时候我们需要做接口测试…

【原创】java+swing+mysql银行ATM管理系统

本文主要介绍使用javaswingmysql去设计一个银行ATM管理系统,模仿实现存款、取款、转账、余额查询等功能。 功能分析: 隐含ATM管理系统一般分为管理员和用户角色,管理员可以进行用户管理、账单管理,用户可以进行转取存款等功能如…

面试不到10分钟就被赶出来了,问的实在是太变态了...

干了两年外包,本来想出来正儿八经找个互联网公司上班,没想到算法死在另一家厂子。 自从加入这家外包公司,每天都在加班,钱倒是给的不少,所以也就忍了。没想到11月一纸通知,所有人不许加班,薪资…

深度学习网络模型——ConvNeXt网络详解、ConvNeXt网络训练花分类数据集整体项目实现

深度学习网络模型——ConvNeXt网络详解、ConvNeXt网络训练花分类数据集整体项目实现1、介绍2、设计方案3、Macro design4、ResNeXt-ify5、Inverted Bottleneck7、Large Kernel Sizes8、Micro Design9、ConvNeXt variants10、ConvNeXt-T 结构图11、网络代码实现:Conv…

内网渗透(三十五)之横向移动篇-IPC配合系统服务横向移动

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

Linux文件权限查看与修改

Linux文件的权限linu文件的权限可以分为四类:可读、可写、可执行、没有权限。分别用字符r、w、x、- 表示。2. 用户与用户组Liunx是一个多用户多任务的操作系统,可以通过用户和用户组来更好的控制文件的权限。每个文件都有一个拥有者(某一个具…

批处理Batch学习

批处理Batch学习 前几天一个月薪35k的兄弟,给我推了一个人工智能学习网站,看了一段时间挺有意思的。包括语音识别、机器翻译等从基础到实战都有,很详细,分享给大家。大家及时保存,说不定啥时候就没了。 基础认识 批…

Linux下Python脚本的编写解析fio(minimal格式)(三)

在服务器测试(storage)过程中,会看到很多人写跑fio的脚本用minimal格式来解析,因为这种格式返回的结果对与脚本(shell,python)解析log非常方便.下面介绍一下这种方式下,用Python来解析log 1 一般客户会要求结果中出现一下参数的值: bandwidth…

推荐几款免费且优秀的短视频配音软件,你值得拥有

科技的迅猛发展带来了新生事物的不断涌现,短视频就是其中之一,有的小伙伴喜欢在茶余饭后记录生活的点点滴滴,也有人将之变成了日常的主要收入来源,但无论是哪种,一款好的AI配音软件都是必不可少的,很多短视…

LeetCode 88. 合并两个有序数组

原题链接 难度:easy\color{Green}{easy}easy 题目描述 给你两个按 非递减顺序 排列的整数数组 nums1nums1nums1 和 nums2nums2nums2,另有两个整数 mmm 和 nnn ,分别表示 nums1nums1nums1 和 nums2nums2nums2 中的元素数目。 请你 合并 num…

Flask像Jenkins一样构建自动化测试任务

flask这个框架很轻量,做一些小工具还是可以很快上手的。 1、自动化 某一天你入职了一家高大上的科技公司,开心的做着软件测试的工作,每天点点点,下班就走,晚上陪女朋友玩王者,生活很惬意。 但是美好时光…

常用类(四)Math类和Arrays类

一、Math类 Math类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数 我们查看math类的常用方法: 我们查看他的源码如下所示: 我们查看他的类图: 他的这些方法基本都是静态的: 我们的代码设置如下所…