Mysql 索引调优

news2025/2/11 20:35:07

前言

索引是帮助MySQL高效获取数据的数据结构

常用索引

1、普通索引

普通索引是最基本的索引,仅用于加速查询,没有任何限制:可以为空、可以重复

2、唯一索引

唯一索引与普通索引类似,但索引列的值必须唯一

3、主键索引

主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值

4、组合索引

组合索引是多列值组成的一个索引,专门用于组合搜索,使用组合索引时遵循最左前缀原则

5、全文索引

全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较,目前只有char、varchar,text 列上可以创建全文索引

6、空间索引

空间索引是对空间数据类型的字段建立的索引,分别是GEOMETRY、POINT、LINESTRING、POLYGON
创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MYISAM的表中创建

创建索引的原则

  • 索引列的数据类型占用存储空间越少越好,因为索引本身也是占用磁盘空间的
  • 索引列的数据不建议为空
  • 索引列的数据重复率不要超过80%
  • 频繁更新的列不要创建索引
  • 在业务允许范围内,建议使用自增长作为主键

索引的数据结构

在线演示

在计算机中,磁盘存储数据最小单元是扇区,一个扇区的大小是512字节
文件系统中,最小单位是块,一个块大小就是4k
InnoDB存储引擎最小储存单元是页,一页大小就是16k

BTree 数据结构

在这里插入图片描述

B树中每个节点最多存储(2个关键字、2个数据区、3个节点引用),一个节点如果超过2个关键字就会自动分裂
B树查找的时间复杂度为O(h * lgn),h为树高,n为每个节点存储关键字的数量
B树相对于平衡二叉树,在数据量相同的情况下,B数据的高度要低于平衡二叉树,减少了IO查询次数

B+Tree 数据结构

在这里插入图片描述

B+树中的根节点和支节点存储的是(关键字、节点引用),相比于B树,其单位节点要存储更多的关键字
B+树的叶子节点存储的是(关键字、数据区),叶子节点是顺序排列的并且相邻叶子节点具有相互引用的关系,非常适合排序

总结

B树的每个节点都存储了数据区、而B+树只有叶子节点才会存储数据区,所以B+树在检索时的IO消耗要小于B树
B+树的叶子节点都是顺序排列的并且相邻叶子节点具有相互引用的关系,所以非常适合做排序

不同数据引擎下的索引实现

MyISAM 数据引擎下的索引

MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址
在这里插入图片描述

InnoDB 数据引擎下的索引

InnoDB引擎使用B+Tree作为索引结构,叶节点的data域存放的是完整的数据记录
在这里插入图片描述

聚簇索引 和 非聚簇索引

MySQL 默认数据引擎 InnoDB 中,数据在进行添加时必须和某一个索引列进行绑定,绑定优先级如下:
1、如果有主键,则和主键进行绑定
2、如果没有主键,则和唯一键进行绑定
3、如果没有唯一键,则根据系统生成的6字节rowid进行绑定
结论:和数据进行绑定的索引称之为聚合索引,反之为非聚合索引。一张表中只能有一个聚合索引,非聚合索引可以有多个
  • 聚簇索引
    在这里插入图片描述
  • 非聚簇索引
    在这里插入图片描述
  • 总结
    聚簇索引的叶子节点直接存储了具体信息或其内存地址,通过内存地址即可快速找到相应的行数据
    在非聚簇索引的叶子节点上存储的是主键 ID,【回表查询】当使用非聚簇索引查询时,首先会得到一个主键 ID,然后再使用主键 ID 去聚簇索引上查找数据

覆盖索引(避免回表查询)

覆盖索引的核心是从非聚簇索引要数据,普通索引(单字段)、联合索引以及唯一索引都能实现覆盖索引的作用

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

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

相关文章

chatgpt赋能python:Python怎么将界面和程序交互

Python怎么将界面和程序交互 随着互联网技术的不断发展和普及,越来越多的人开始关注于网站的设计和开发。在Web应用程序的开发过程中,与用户进行交互是至关重要的一个方面,而Python作为一种强大的开发语言,可以很好地帮助我们实现…

C++中防止头文件重复包含处理办法

首先给出可以拷贝的模板&#xff1a; #ifndef _ADDNUM_H_ #define _ADDNUM_H_这里加上相应的函数声明即可 #endif在小型项目中&#xff0c;如果将函数的定义写在main函数的后面&#xff0c;那么需要在main函数前面加上这个函数的声明才可以顺利运行成功。 #include <iostr…

python:基础知识—流程控制—函数与模块—数据结构—类与GUI和Turtle—异常处理与文件,概括全书(上万字最详细版)

这里是一张夜景&#xff0c;给大家放松一下。 !&#xff01;无锡南长街 文章目录 模块一&#xff1a;基础知识1、python语言2、常见数字类型3、字符串4、数字类型转换5、标识符命名6、常见关键字7、运算符与表达式&#xff08;1&#xff09;算术运算符&#xff08;2&#xff09…

web自动化框架playwright

参考&#xff1a;新兴爬虫利器 Playwright 的基本用法 | 静觅 (cuiqingcai.com) http://t.csdn.cn/S7260 官方文档&#xff1a;Trace viewer | Playwright 安装 pip3 install playwright playwright install 第一个demo from playwright.sync_api import sync_playwri…

python中的lambda表达式

目录 1.lambda函数的简介 2.为什么要用lambda函数 3.lambda函数的效率 4.lambda函数常用举例 4.1 多参数 4.2 与map函数进行使用 4.3 求两个列表元素的和 5.个人见解 1.lambda函数的简介 lambda函数是一种匿名函数&#xff0c;即没有名字的函数使用lambda保留字定…

Qt(C++)调用libass库完成ASS字幕渲染显示(高级版)

一、项目实现 1.1 实现效果 1.2 开发环境 Qt版本: 5.12.6 编译器: MinGW_32位、MSVC_32位(2017) 操作系统: win10 X64 1.3 实现功能 当前利用Qt+libass库完成了ASS字幕渲染显示,字幕渲染也就是将ASS文件里的当前时间段的字幕信息传递给libass库,渲染之后返回一张图片,在…

chatgpt赋能python:如何使用Python得到8/3的小数部分

如何使用Python得到8/3的小数部分 在数学中&#xff0c;8/3是一个分数&#xff0c;可以被表示为2.6666666666666665。然而&#xff0c;在Python中&#xff0c;我们可以使用一些技巧来得到它的小数部分。 什么是小数部分&#xff1f; 小数部分是一个数的小数点后的部分&#…

Spring Security--密码加密

项目的话&#xff0c;我们是继续写的&#xff0c;此时项目是已经实现了数据库的用户名&#xff0c;密码登录&#xff0c;且用的是自己的登录页面。 密码加密我们用到这PasswordEncoder这个接口 public interface PasswordEncoder {String encode(CharSequence rawPassword);b…

gitlab+jenkins+harbor实现CI/CD(1)——环境准备

gitlabjenkinsharbor实现CI/CD&#xff08;1&#xff09;——环境准备 前言一、git工具git安装初始化版本库登录上传 二、gitlab使用gitlab部署登录设置克隆项目 jenkins使用安装jenkins登录设置 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&am…

D349周赛:注意题目提示里,数据范围隐含的算法复杂度提示

文章目录 6470.既不是最大值也不是最小值完整版为什么两个for循环时间复杂度还是不变的 6465.执行子串操作后的字典序最小字符串思路最开始的写法题意理解的问题 修改版a必须单独拿出来的原因 6449.收集巧克力思路注意提示信息 完整版补充&#xff1a;由数据范围反推算法复杂度…

统计学中的「标准差和方差」

标准差(Standard deviation) 简单来说&#xff0c;标准差是一组数值自平均值分散程度的一种测量观念。一个较大的标准差&#xff0c;代表大部分的数值和其平均值之间差异较大&#xff0c;一个较小的标准差&#xff0c;代表这些数值较接近平均值。 例如&#xff1a; 两组数的集…

开源数字人、虚拟直播部署教程

TheRamU/Fay: 语音互动,直播自动带货 虚拟数字人 (github.com) gitee fay: 这是一个数字人项目,包含python内核及ue数字人模型,可以用于做数字助理及自动直播,又或者作为你的应用入口也很帅 (gitee.com) 2022.10.27 补充mac上的安装办法:(34条消息) Fay数字人开源项目…

prisma 学习记录

1、prisma 可以看做是一个 ORM。 安装 prisma npm install prisma -D 设置要链接的数据库 npx prisma init --datasource-provider sqlite --datasource-provider 要使用的数据库 2、prisma 中的模型&#xff0c; 表示底层数据库中的表或者集合。 生成 Prisma Client API 的基…

chatgpt赋能python:Python中的延迟:如何暂停程序执行?

Python中的延迟&#xff1a;如何暂停程序执行&#xff1f; 如果你在编写Python程序时需要实现延迟效果&#xff0c;比如等待某些条件满足后再进行下一步操作&#xff0c;那么你可能需要使用Python提供的延迟功能。这篇文章将介绍Python中的延迟实现方法&#xff0c;并提供几个…

记一次面试中的相关问题

1. protobuf内部的实现原理 序列化与反序列化&#xff0c;比如对于数字它要求根据数字的大小选择存储空间&#xff0c;小于15的数字只用1个字节来表示&#xff0c;大于15的数用2个字节来表示&#xff0c;以此类推&#xff0c;这样要求可以尽可能地节省空间。Protobuf的一大特点…

chatgpt赋能python:Python教程:如何建立一个空列表

Python教程&#xff1a;如何建立一个空列表 Python是一种广泛应用于科学计算、数据分析、机器学习等领域的高级编程语言。在Python中&#xff0c;列表是一种非常重要的数据类型&#xff0c;可以用来存储许多不同类型的数据。在本文中&#xff0c;我们将介绍如何在Python中建立…

OJ Primed Subsequence

原题链接&#xff1a;传送锚点 1.题目 Description Given a sequence of positive integers of length n, we define a primed subsequence as a consecutive subsequence of length at least two that sums to a prime number greater than or equal to two. For ex…

【嵌入式IMAGE 3】opencv的搭建

1. OpenCV源代码下载地址 https://opencv.org/releases/ 2. 在windows平台编译&#xff08;mingw版本&#xff09; 2.1 下载cmake https://cmake.org/files/ 2.2 配置编译器环境变量 2.3 打开cmake-gui.exe a.Use default native compilers 使用默认的本机编译器 b.Specify n…

MyBatis(全)

文章目录 什么是MyBatis?MyBatis快速入门查询user表中所有数据 Mapper代理开发使用Mapper代理方式完成入门案例 MyBatis核心配置文件配置文件完成增删改查案例&#xff1a;完成品牌数据的增删改查操作准备环境查询-查询所有数据查询-查看详情查询-条件查询--1.多条件查询方法1…

css移动端

目录 谷歌模拟器 屏幕分辨率 视口 二倍图 适配方案 rem 简介 问题 媒体查询 移动端 设备宽度不同&#xff0c;HTML标签字号设置多少合适 flexible.js rem-移动端适配 less 注释 运算 嵌套 变量 导入 导出 禁止导出 谷歌模拟器 模拟移动设备&#xff0c;方…