读《高性能MySQL》笔记---索引

news2025/2/28 23:19:27

索引是存储引擎用于快速找到记录的的一种数据结构。

索引的优点

  1. 索引大大减少服务器需要扫描的数据量。
  2. 索引帮助服务器避免排序和临时表。
  3. 索引将随机IO变为顺序IO。

说明:
顺序IO:是指读写操作的访问地址连续。在顺序IO访问中,HDD所需的磁道搜索时间显着减少,因为读/写磁头可以以最小的移动访问下一个块。数据备份和日志记录等业务是顺序IO业务。
随机IO:是指读写操作时间连续,但访问地址不连续,随机分布在磁盘的地址空间中。产生随机IO的业务有OLTP服务,SQL,即时消息服务等。

为什么说索引将随机IO变为顺序IO?
在这里插入图片描述

如图:在没有索引的情况下,全表扫描。先找1号记录所在的位置,磁盘从我们面前滚过,第一个是A,A里面存放的是5号记录,不是我们想要的,我们不取;第二个是B,B里面存放的是4号记录,也不是我们想要的,我们也不取……直到转到E,这时候我们发现E里面的记录是1号记录了,我们取出来,对比一下编号,发现这是1号记录,不是我们想要的2号记录,于是我们丢弃,开始下一周期,直到找到2号记录为止。这里这个取回的动作就是IO动作,你会发现它是不连续的,并不是每次磁盘滚过都要取,有一定的随机性,所以这就是随机IO。
有索引的时候,使用索引查找。磁盘依然从我们面前滚过,第一个是A,我们不取;第二个是B,我们也不取……因为我们已经准确地预知我们想要的是2号记录,所以当磁盘滚到D时,我们直接一次性取出,不用再等下一个周期,这就变成了顺序IO。

索引类型

B-Tree索引

在这里插入图片描述
在这里插入图片描述

b-tree是一种索引类型。不同的存储引擎可能使用不同的存储结构来实现,比如InnoDB是B+tree(即:每一个叶子结点包含指向下一个叶子节点的指针,从而方便叶子节点的范围遍历);不同的存储引擎使用B-tree的方式也各不相同,比如MyISAM使用前缀压缩技术使得索引更小,索引的叶子节点存放了指向行数据的物理地址;InnoDB则按照原数据格式进行存储,索引的叶子节点存放的是行所有数据。
b-tree索引所有适用于全值匹配、最左前缀匹配、列前缀匹配、匹配范围值、精确匹配某一列并范围匹配另外一列、只访问索引的查询(索引覆盖)。
b-tree索引的使用限制:①如果不是按照索引的最左开始查找,则无法使用索引。②不能跳过索引中的列。③如果查询中有某个列的范围查询,则其右边所有的列都无法使用索引优化查找。

哈希索引

哈希索引是基于哈希表实现的,只有精确匹配索引所有列的查询才有效。对于每一行数据存储引擎都会对所有的所有列计算一个哈希码。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。
在MySQL中,自有Memory引擎显式支持哈希索引。哈希索引只存储对于的哈希值,所以索引的结构十分紧凑,这也让哈希索引的查找速度非常快。
哈希索引的缺点:

  1. 哈希索引不包含行数据,查找过程先找到数据行指针,再去磁盘中读取查找数据。
  2. 哈希索引不是按照所有值顺序排序存储的,所以无法用于排序。
  3. 哈希索引只能全值匹配,不支持部分索引列匹配查找。
  4. 哈希索引只支持等值比较查询,如:=、IN()、<=>
  5. 哈希冲突很多的话,一些索引维护操作的代价也会很高。

InnoDB引擎有一种特殊的公共:自适应哈希索引,对永无无感知。

空间数据索引

MyISAM表支持空间索引,用作地理数据存储。空间索引会冲所有维度来索引数据,查询时,可以有效的使用任意比较索引中的值。

全文索引

全文索引是一种特殊类型的索引,它查找文本中的关键词,而不是直接比较索引的值。

高性能索引策略

  1. 索引列不能是表达式的一部分,也不能是函数的参数,必须只能是独立的列。
  2. 使用前缀索引时,要选择合适的前缀值长度:
    1. 索引的选择性:不重复的索引值 / 表数据总数 的值。选这个值约小,择性越高,反之越低。
    2. 对于BLOB和TEXT或者很长的VARCHAR类型的列,必须使用前缀索引。
    3. 当完整索引列的前n个字符的选择性和完整索引列的选择性相差值比n-1和n+1都小时,前缀索引的前缀字符数就为n
    4. 创建前缀索引:
ALTER TABLE test_table ADD KEY(citu(7))
  1. 合适的情况可以创建多列索引。且一般将选择性最高的列放在索引的最前列,但有时候也需要把选择性小的列放前面,查询的时候如果要命中索引的话就必须IN选择性小的索引,比如:肤色,in(white,yellow,black)

4.聚簇索引

聚簇索引并不是一种索引类型,而是一种数据存储方式。聚簇索引的数据行存放在了索引的叶子节点上,把数据行和相邻的键值紧凑的储存在一起,所以成为“聚簇”。
优点:

  1. 可以把整个数据保持在一起。
  2. 数据访问快。
  3. 使用覆盖索引扫描查询可以直接使用子节点主键值。

缺点:

  1. 插入速度严重依赖于插入顺序。
  2. 更新聚簇索引列的代价很高,因为会强制InnoDB将每个被更新的行移动 到新的位置。
  3. 插入新行,可能面临页分裂的问题。
  4. 对于行比较稀疏或者是页分裂导致数据存储不连续时,全表扫描很慢。
  5. 二级索引访问需要两次索引查找,而不是一次。

MyISAM引擎的主键索引和一般索引没多大差别:叶子节点都是存放是行数据的指针。而InnoDB引擎的聚簇索引的每一个叶子节点包含主键值、事务ID、回滚指针、和剩余的列,二级索引的叶子节点存储的不是行指针而是主键值。
在这里插入图片描述

在InnoDB表中,主键需要保证单调,这样才能最大的提升插入速度,更小的减少数据库碎片。

5.覆盖索引

好处:

  1. 索引数目通常小于数据行大小,通过读取索引就能找到查询数据,极大减小访问量。

  2. 索引是按顺序存储的,所以对于IO密集型的范围查询会比随机IO要少得多。

  3. 尽量使用索引扫描来做排序,当索引的列顺序和order by子句顺序完全一致,且所有列的排序方向一样,MySQL才能使用索引来对结果做排序。

  4. 前缀压缩索引:先完全保存索引库的第一个值,然后其他值和第一个值得到相同的前缀的字节数和不同的后缀部分,然后把这两部分加起来即可,例如:第一个值abcd,第二个值可以为“3,edf”,实际为abcedf.

  5. 避免冗余和从夫索引。可以使用一些工具(例如:Percona)来检查是否有冗余和重复索引。

  6. 删除未使用的索引,统一可以用一些工具(比如:Percona Server)来检查。

  7. 通过索引尽量锁住少量的行数据,保证更大的并发度。

维护索引和表

  1. 使用CHECK TABLE检查是否发生表损坏,然后使用REPAIR TABLE来修复表。
  2. 使用ANALYZE TABLE来重新生成统计信息,从而更新索引的统计信息。使用show index from table_name查看索引信息。
  3. 减少索引和数据碎片。可以通过OPTIMIZE TABLE指令或者重新导出和导入来整理数据。或者通过no-op的alter table操作来重建表,比如alter table table_name engine=(之前的engine)

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

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

相关文章

生产环境日志还用notepad++?难怪定位慢,UltraEdit了解一下!

最近这两天运营部门反馈有会员的会员卡开卡时间与相关页面显示的开卡时间不一致&#xff0c;需要定位确定哪个时间是准确的。对于线上数据异常问题一定要谨慎处理&#xff0c;因为很有可能会是用户的某些非常规操作导致部分场景漏测。 对于这种数据异常的业务问题&#xff…

顺序存储二叉数(Java)

1、顺序存储二叉数 从存储角度来看&#xff0c;我们之前讲的树在存储结构上不是顺序存储的&#xff0c;都是非线性的存储结构&#xff0c;所以我们可以从数组的角度来分析&#xff0c;数组和树可以相互转换&#xff0c;数组可以转换成树&#xff0c;树也可以转换成数组&#x…

吗咿呀嘿-用js来搞个简单的人脸识别

缘起 “蚂蚁呀嘿&#xff0c;蚂蚁呀呼&#xff0c;蚂蚁呀哈” 相信最近好多人的朋友圈或者抖音都被类似视频刷过屏&#xff01; 类似的效果最早是在2020年初&#xff0c;那个时候大家应该还都记得&#xff0c;几乎所有的人都因为疫情原因被迫线上办公&#xff01; 工作当然离不…

mybatisPlus

第十一章&#xff1a;Mybatis_plus 第1节&#xff1a;简介 本章节主要介绍mybatisPlus是mybatis的增强工具&#xff0c;只做增强不做改变&#xff0c;不会对mybatis产生任何影响。它的主要优势具有无侵入、损耗小、强大的CRUD操作、支持 Lambda 形式调用、支持 ActiveRecord模…

向毕业妥协系列之机器学习笔记:无监督学习-异常检测

目录 一.发现异常事件 二.高斯正态分布 三.异常检测算法 四.开发与评估异常检测系统 五.异常检测与监督学习对比 六.选择使用什么特征 一.发现异常事件 下图的例子是飞机发动机的制造&#xff0c;有很多特征&#xff0c;我们为了方便讲解取其中的两个特征&#xff1a;发…

基于JavaWeb的小区物业管理系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

(1)paddle---在anaconda中安装paddle环境

1、 创建一个anaconda的环境 (1)创建 conda create --name chenpaddle_cp310 python=3.10 如果要删除 conda remove -n chenpaddle_cp310 --all (2)查看现有环境 conda env list #查看现有环境 2、安装 paddlepaddle (1)查看自己安装的cuda版本 nvidia-smi 发现…

java计算机毕业设计ssm+vue工商学院办公用品管理信息系统

项目介绍 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时…

Linux内存管理知识总结(一)

以下源代码来自 linux-5.10.3 内核代码&#xff0c;主要以 x86-32 为例 Linux 内存管理是一个很复杂的“工程”&#xff0c;它不仅仅是对物理内存的管理&#xff0c;也涉及到虚拟内存管理、内存交换和内存回收等 物理内存的探测 Linux 内核通过 detect_memory()函数实现对物…

2021年认证杯SPSSPRO杯数学建模B题(第一阶段)依巴谷星表中的毕星团求解全过程文档及程序

2021年认证杯SPSSPRO杯数学建模 B题 依巴谷星表中的毕星团 原题再现&#xff1a; 依巴谷卫星&#xff08;High Precision Parallax Collecting Satellite&#xff0c;缩写为 Hip-parcos&#xff09;&#xff0c;全称为“依巴谷高精度视差测量卫星”&#xff0c;是欧洲空间局发…

Java培训:重试实现高可用方案

1、背景介绍 随着互联网的发展项目中的业务功能越来越复杂&#xff0c;有一些基础服务我们不可避免的会去调用一些第三方的接口或者公司内其他项目中提供的服务&#xff0c;但是远程服务的健壮性和网络稳定性都是不可控因素。在测试阶段可能没有什么异常情况&#xff0c;但上…

Kubernetes存储机制认识

前言&#xff1a; 在Kubernetes系统中&#xff0c;将对容器应用所需的存储资源抽象为存储卷&#xff08;Volume&#xff09;。Volume是与Pod绑定的&#xff08;独立于容器&#xff09;与Pod具有相同生命周期的资源对象。 可以将Volume的内容理解为目录或文件&#xff0c;容器…

Sqoop Hook

环境: ambari大数据平台 sqoop版本1.4.7 hive版本3.1.0 Atlas版本2.2.0 Atlas使用官网给的sqoop hook 具体安装步骤 1、官网安装步骤:https://atlas.apache.org/#/HookSqoop 2、其他安装步骤:https://www.freesion.com/article/45701353391/ 根据以上两个安装的步骤可以解决…

Oracle LiveLabs实验:Automatic Partitioning in Autonomous Database

概述 此实验申请地址在这里。 实验帮助在这里。 此实验预估完成时间100分钟。 关于自治数据库自动分区的帮助文档&#xff0c;请参见这里。 这个实验设计得很好&#xff0c;推荐。 介绍 关于本研讨会 自治数据库中的自动分区分析您的应用程序工作负载&#xff0c;并自动…

使用Ubuntu演示介绍,Linux下安装和配置Redis、配置远程连接redis(保姆级教学)

安装redis 1、先在官网下载好Redis的安装包 Redis 官网&#xff1a;https://redis.io/ Redis 在线测试&#xff1a;http://try.redis.io/ Redis菜鸟教程&#xff1a; https://www.runoob.com/redis/redis-tutorial.html 2、把下载好的安装包放在Ubantu的共享文件夹下 3、Linu…

电商行业少不了的营销方式——邮件营销

邮件营销可以贯穿到客户购买商品的整个流程中&#xff0c;帮助企业以低成本的引流方式获取较高的销售额。邮件营销不同于其他营销方式&#xff0c;如果你获取了客户的邮件信息&#xff0c;可以和客户保持长期的联系&#xff0c;为品牌积累一定的客户资源。这种方式除了能够提升…

Ubuntu20.04.4 LTS正确安装方案及问题解决

Ubuntu20.04.4 LTS报错解决方案1. 开启系统功能支持2. 升级wsl3. 重新打开Ubuntu,输入用户名和密码完成安装4. 其它报错参考1. 开启系统功能支持 打开搜索,输入功能,进入启用或关闭Windows功能 开启适用于Linux的Windows子系统与虚拟机平台 注意: 这两个都得开, 不然会报错 …

MySQL索引理解

目录 什么是索引? 索引的好处 思考一个小问题, 索引这么好, 那是不是越多越好? 索引分类 索引的创建和删除 explain字段解释 索引底层数据结构 区分MyISAM和InnoDB存储引擎来再认知聚簇非聚簇索引 什么是索引? 索引: 类似于目录的帮助快速检索数据的一种数据结构. 辅…

Dragonfly 中 P2P 传输协议优化

文&#xff5c;孙珩珂 上海交通大学 本文1987字 阅读 10 分钟 01 优化背景 此前 Dragonfly 的 P2P 下载采用静态限流策略&#xff0c;相关配置项在 dfget.yaml 配置文件中&#xff1a; # 下载服务选项。 download: # 总下载限速。 totalRateLimit: 1024Mi # 单个任务…

Java-IO流学习

文章目录前言1.Java-IO流简介2.流的基本概念3.创建文件的三种方式3.1根据一个文件路径直接创建一个文件。3.2 根据父目录 File 对象&#xff0c;在子路径创建一个文件3.3 根据父目录路径&#xff0c;在子路径下生成文件4.获取文件信息5.目录与文件操作5.1文件删除5.2目录删除5.…