MySql性能优化(四)索引

news2024/10/7 6:02:29

Index

  • 索引相关概念
    • 数据结构
      • B+树
    • 优点及用处
      • 优点
      • 用处
    • 分类
    • 技术名词
      • 回表
      • 覆盖索引
      • 最左匹配
      • 索引下推
    • 索引的匹配方式
    • 哈希索引
      • 特点
      • 代价
      • 案例
    • 组合索引
      • 案例
    • 聚簇索引与非聚簇索引
      • 聚簇索引
      • 非聚簇索引
    • 覆盖索引
      • 基本介绍
      • 优点
      • 判断
  • 参考

索引相关概念

数据结构

B+树

推荐一篇讲的很不错的文章(为什么MySQL数据库索引选择使用B+树?)在这里插入图片描述

1. 无论是二叉树还是红黑树,都会因为树的深度过深导致IO次数变多,影响数据读取效率	
2. InnoDB是通过B+Tree结构对主键创建索引,然后叶子节点当中存储数据,如果没有主键,那么会选择唯一键,如果没有唯一键,那么会生成一个6位数的row_id来作为主键	
3. 如果创建索引的键是其他字段,那么在叶子节点中存储的是该记录的主键,然后再通过主键索引找到对应的记录,叫做回表

优点及用处

优点

 1.达到减少服务器所需要扫描的数据量
 
 2.帮助服务器避免排序和临时表
 
 3.将随机io变成顺序io

用处

1.快速查找匹配where子句的行

2.从consideration中消除行。如果可以再多个索引当中选择,Mysql一半会使用找到最少行的索引

3.如果具有多列索引,则优化器可以使用索引的任何最左前缀来查找行

4.当有表连接的时候,从其他表检索数据

5.查找特定索引的max或者min值

6.如果排序或分组时在可用索引的最左前缀上完成,则对表进行排序和分组

7.在某些情况下,可以优化查询以检索值而无需查找数据行

分类

1.主键索引(PRIMARY KEY)

主键索引是一种特殊的唯一索引,不允许有空值。一般是在建表的时候指定了主键,就会创建主键索引,CREATE INDEX不能用来创建主键索引,使用Alert table来代替

2.唯一索引
数据库会为我们自动创建索引,创建的就是唯一索引
与普通索引类似,不同的就是,索引的列值必须唯一,但允许有空置。如果是组合索引,则列值的组合必须唯一。

3.普通索引

最基本的索引,没有任何限制

4.全文索引

全文索引用于全文搜索。只有InnoDB和 MyISAM存储引擎支持 FULLTEXT索引,仅适用于 CHAR, VARCHAR和 TEXT列。

5.组合索引

一个索引包含多个列

技术名词

回表

同B+树第三点( 如果创建索引的键是其他字段,那么在叶子节点中存储的是该记录的主键,然后再通过主键索引找到对应的记录,叫做回表)
通俗点讲就是 select 当中有大量的非索引列,查到之后去表中查询相应列信息。

覆盖索引

与回表相对应,只需要在一棵索引树上就能获取SQL 所需的所有列信息,无需回表,速度更快。

explain的输出结果Extra字段为Using index时,能够触发索引覆盖。

最左匹配

在MySQL建立联合索引时会遵守最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配

参考下文的组合索引案例
建立索引 a,b,c

语句										索引是否有用
where a =1                              有,只使用了a             
where a = 1 and b =1                    有,用了a,b
where a = 1 and b =1  and c =2          有,用了a,b
where b =2 or c = 4                     否
where a=1 and c =2                      是,只是有了a
where a =3 and b > 10 and c = 7         是,只是有了a,b
where a = 3 and b like "%5%" and c = 7  是,只用到了a

索引下推

索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询。

举个例子,现在有 索引 a_b_c

5.6之前
 where a like 'a%' and b =1 and c =2 
根据最左匹配原则,会从索引匹配到a,然后回表查询,再对b 和 c进行过滤,回表比较多

5.6之后
会在索引内部就判断好b = 1 and c=2 然后再次回表查询,回表就比较少

前文MySql性能优化(三)执行计划详解 最后的 extra当中:

Using index condition:在5.6版本后加入的新特性(Index Condition Pushdown); Using index condition 会先条件过滤索引,过滤完索引后找到所有符合索引条件的数据行,随后用 WHERE 子句中的其他条件去过滤这些数据行; using index condition = using index + 回表 + where 过滤

表示已经使用了索引下推

索引的匹配方式

全值匹配
索引值和所有的列进行匹配

匹配最左前缀
参照上文最左匹配
在这里插入图片描述

匹配列前缀
可以匹配一个列开头部分
比如说截取多长的字段当作索引

匹配范围值
可以查找某个范围的值

精确匹配某一列并范围匹配另一列

只访问索引的查询

哈希索引

特点

  1. 基于哈希表的实现,只有精确匹配索引列所有值的查询才有效(范围查询不可用)
  2. 在mysql当中,只有memory的存储引擎支持哈希索引
  3. 哈希索引存储对应hash值,所以索引十分紧凑,这让hash索引速度十分快

代价

  1. 哈希索引只包含哈希值和行指针,而不存储字段值,索引不能使用索引中的值来避免读取行
  2. 哈希索引数据并不是按照索引值顺序存储的,所以无法进行排序
  3. 哈希索引不支持部分匹配查找,哈希索引是使用索引列的全部内容来计算哈希值
  4. 哈希索引支持等值比较查询,不支持任何范围查询
  5. 访问哈希索引的数据非常快,除非有很多哈希冲突,当出现哈希冲突时,存储引擎必须遍历链表中的所有行指针,逐行进行比较,直到查找到所有符合条件的行
  6. 哈希冲突比较高的时候,维护代价也会很高

案例

当需要存储大量的URL,并且根据url进行搜索查找的时候,如果使用B+树,存储内容就会很大。

select id from url_table where url = “”

这时候可以将url使用CRC32做哈希,可以使用以下查询方式

select id from url_table where url = “” and url_crc=CRC32(“”)

此查询效率较高,因为使用体积很小的索引来完成查找

组合索引

当包含多个列为索引,需要注意正确的顺序依赖于该索引的查询,同时需要考虑如何更好的满足排序和分组的需要

案例

建立索引 a,b,c

语句										索引是否有用
where a =1                              有,只使用了a             
where a = 1 and b =1                    有,用了a,b
where a = 1 and b =1  and c =2          有,用了a,b
where b =2 or c = 4                     否
where a=1 and c =2                      是,只是有了a
where a =3 and b > 10 and c = 7         是,只是有了a,b
where a = 3 and b like "%5%" and c = 7  是,只用到了a

聚簇索引与非聚簇索引

聚簇索引

索引和数据文件存放在一起

优点

  1. 可以把相关数据保存在一起
  2. 数据访问更快,因为索引和数据保存在一个树当中
  3. 使用覆盖索引扫描的查询可以直接使用页节点中的主键值

缺点

  1. 聚簇数据最大限度的提高了IO密集型应用的性能,如果数据全部放在内存,那聚簇索引没啥优势
  2. 插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式
  3. 更新聚簇索引列的代价很高,因为会强制将每个被更新的行移动到新的位置
  4. 基于聚簇索引的表在插入新行,或者主键被更新需要移动行的时候,可能面临页分裂的问题
  5. 聚簇索引可能导致全表扫描变慢,尤其是行比较稀疏,或者由于页分裂导致存储数据不连续的时候

非聚簇索引

索引和数据文件分开存放

覆盖索引

基本介绍

  1. 如果一个列包含所有需要查询的字段的值,我们称之为覆盖索引
  2. 不是所有类型的索引都可以称为覆盖索引。覆盖索引必须要存储索引列的值
  3. 不同的存储实现覆盖索引的方式不同,不是所有的引擎都支持覆盖索引,memory不支持覆盖索引

优点

  1. 索引条目往往小于数据行代销,如果只需要读取索引,那么mysql就会极大的减少数据访问量
  2. 因为索引是按照列值顺序存储的,所以对于IO密集型的范围查询回避随机从磁盘读取每一行数据的IO要少的多
  3. 一些存储引擎如MYISAM在内存中只要缓存索引,数据则依赖于操作系统来缓存,因此要访问数据需要一次系统调用,这可能会导致严重的性能问题
  4. 由于INNODB的聚簇索引,覆盖索引对INNODB表特别有用

判断

当发起一个被索引覆盖的查询时,在explain的extra列可以看到using index的信息,此时就使用了覆盖索引

参考

MySQL索引底层:B+树详解
MySQL索引为什么要用B+树实现
索引下推
MYSQL 官方文档

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

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

相关文章

【小程序】wxss与rpx单位以及全局样式和局部样式

目录 WXSS 1. 什么是 WXSS 2. WXSS 和 CSS 的关系 rpx 1. 什么是 rpx 尺寸单位 2. rpx 的实现原理 3. rpx 与 px 之间的单位换算* 样式导入 1. 什么是样式导入 2. import 的语法格式 全局样式和局部样式 1. 全局样式 2. 局部样式 WXSS 1. 什么是 WXSS WXSS (We…

Linux网络与数据封装

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 Linux网络与数据封装1. 网络应用程序的设计模式(1)C/S架构(2&#…

VRTK4 入门指南

VRTK4 说明文档VRTK Farm Yard 示例 - Virtual Reality Toolkit要求使用 Unity 2020.3.24f1.Beta 免责声明简介入门下载项目在 Unity 中打开下载的项目使用 Unity Hub在 Unity 中打开项目运行示例场景Made With VRTK贡献第三方包许可证VRTK Farm Yard 示例 - Virtual Reality T…

家居建材行业数字化重构,依靠CRM打通全流程

国家十四五规划提出大力推进产业数字化转型,如今各行各业数字化进程如火如荼,传统行业将数字化转型视为重塑产业竞争力的重要途径。因此,即便是数字化率平均只有10%的家具建材业,也在积极进行全生命周期的产品数字化、全域营销数字…

加载速度提升 15%,关于 Python 启动加速探索与实践的解析 | 龙蜥技术

编者按:在刚刚结束的 PyCon China 2022 大会上,龙蜥社区开发者严懿宸分享了主题为《Python 启动加速的探索与实践》的技术演讲。本次演讲,作者将从 CPython 社区相关工作、本方案的设计及实现,以及业务层面的集成等方面进行介绍。…

Python基础知识入门(四)

Python基础知识入门(一) Python基础知识入门(二) Python基础知识入门(三) 一、条件控制 条件语句是通过一条或多条语句的执行结果(True 或者False)来决定执行的代码块。 注意&…

使用CMake编译基于OpenCV开发的程序的方法

方法 使用CMake编译OpenCV开发的程序分为以下几个步骤: 安装编译器和代码编辑器。 Windows安装Visual Studio社区版,集成了编译器和代码编辑器。Ubuntu安装gcc、g和VSCode: sudo apt install gcc gcmacOS安装XCode Commandline Tools和VS…

R语言应用xgboost进行机器学习(1)

XGBoost 机器学习模型是一种高效且可扩的展的机器学习分类器,由 Chen 和 Guestrin 在 2016 年推广。XGBoost原理是是在决策树的基础上产生迭代,它以 boosting 的方式结合了多个决策树。通常创建每棵新树是为了通过梯度提升来减少先前模型的误差&#xff…

鸿翼档案,将非结构化数据治理能力应用于档案管理的先行者

数字化时代,每个人每天都要接触大量的数据。人们通过分析数据获取信息与知识,帮助自身更好地理解社会动向,掌握行业发展。我们每天都会接触到多种多样的数据,这些数据根据结构可划分为三种:结构化数据、非结构化数据和…

Android设计模式详解之责任链模式

前言 责任链模式是行为型设计模式; 定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。 使用场景:…

基于概率论的MATLAB仿真,内容包括非共轭条件下的后验概率的推导,共轭条件下的非完备集的后验概率的推导

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 1.1先验概率的推导 根据贝叶斯概率论可知,某一事件的后验概率可以根据先验概率来获得,因此,这里首先对事件的先验概率分布进行理论的推导。假设测量的腐蚀数据…

[一个无框架的javaweb demo]番荒之冢 --番剧灯塔站

文章目录番荒之冢 --番剧灯塔站理念大致设计权限分配番剧信息用户/管理员信息邮箱正则匹配URL正则匹配留言信息数据库设计useranimationcommentfavoranim技术栈(无框架)功能一个简单的登录(进行了路由限制, 若未登录都会跳转至此)首页我的我的资料追番清单留言区番剧详情退出登…

华为云-计算云服务介绍

前言 相信很多小伙伴在刚开始接触各类云产品的时候,被各种各样的云产品类如规格、型号、价格、适用场景等问题所困扰。本文就给大家介绍一下华为云常见云产品的规格区别和适用场景。帮助大家选择合适的云产品。 文章目录前言一、计算云服务1.弹性云服务器2.裸金属服…

Apache Flink 部署模式

目录 会话模式 Session Mode 单作业模式 Per-Job Mode (deprecated) 应用模式 Application Mode 在一些应用场景中,对于集群资源分配和占用的方式,可能会有特定的需求。Flink 为各种场景提供了不同的部署模式,主要有以下三种: i…

ArcGIS | NetCDF数据在ArcMap中的使用

NetCDF又称科学数据集,可以存储温度、湿度、风速、风向等多个维度的文件格式。以中国区域地面气象要素驱动数据集为例进行介绍。 中国区域地面气象要素驱动数据集,包括近地面气温、近地面气压、近地面空气比湿、近地面全风速、地面向下短波辐射、地面向…

P6 PyTorch 常用数学运算

前言: 这里主要介绍一下PyTorch 的常用数学运算 目录: 1: add|sub 加减法 2: mul/div 乘/除运算 3: 矩阵乘法 4 2D矩阵转置 5 其它常用数学运算 6 clamp 梯度剪裁 一 加减法 1.1 加法 可以直接通过符号 或者 torch.add # -*- co…

MySQL数据库的安装、创建库及连接取数

安装MySQL数据库MySQL数据库简介安装MySQL数据库下载安装包安装MySQLMySQL创建一个新的数据库,并在其中创建新的数据表,填充测试数据并查看mysql>模式下输入的每句sql语句都要以;结尾;若多行语句无;,则被默认为一条语句未输入完…

UNIX环境高级编程——1.UNIX基础知识

UNIX基础知识 UNIX体系结构 严格意义上来说,可以将操作系统定义为一种软件,控制计算机硬件资源,提供程序运行环境。通常把这种软件成为内核。内核的接口被成为系统调用(system call)。公共函数库构建在系统调用接口之…

碳酸锂、碳酸氢锂除钙镁离子交换柱

锂及其盐类是国民经济和国防建设中具有重要意义的战略物资,也是与人们生活息息相关的能源材料。而碳酸锂作为锂盐的基础盐,是制取锂化合物和金属锂的原料,可作铝冶炼的电解浴添加剂,亦可用于合成橡胶、染料、半导体等方面。电池级…

Orin+ GMSL (Ser 9295+Des 9296)流程分析(1)

文章目录 1 前言2 流程分析2.1 整体架构2.2 Ser端2.2 Des端2.3 软件架构2.4 设备树文件分析2.5 VI 接口2.7 CSI 接口1 前言 Maxim 支持GMSL作为汽车行业视频应用的通信链路。GMSL基于SerDes (Serializer-Deserializer)技术;也就是说,它在发送端使用序列化器,在接收端使用反序…