读高性能MySQL(第4版)笔记08_创建高性能索引(上)

1. 索引

1.1. 键(key)

1.2. 存储引擎用于快速找到记录的一种数据结构

1.3. 当表中的数据量越来越大时,索引对性能的影响愈发重要

1.4. 在数据量较小且负载较低时,缺少合适的索引对性能的影响可能还不明显

1.5. 索引优化是对查询性能优化最有效的手段

1.6. 索引能够轻易将查询性能提高几个数量级

1.7. “最优”的索引有时比一个“好的”索引性能要好两个数量级

1.8. 创建一个真正“最优”的索引经常需要重写查询

1.9. 可以包含一列或多列的值

1.10. 包含多列,那么列的顺序也十分重要

1.10.1. MySQL只能有效地使用索引的最左前缀列

1.11. 在精妙和复杂的索引面前,无论ORM工具多么精巧,都不要对其抱太大希望

1.12. 即使是查询优化技术专家也很难兼顾到各种情况,更别说ORM了

2. 索引的类型

2.1. 在MySQL中,索引是在存储引擎层而不是服务器层实现的

2.2. 不同存储引擎的索引的工作方式并不一样,也不是所有的存储引擎都支持所有类型的索引

2.3. 在优化性能的时候,可能需要使用相同的列但顺序不同的索引来满足不同类型的查询需求

2.4. B-tree索引

2.4.1. 使用B-tree数据结构来存储数据

2.4.2. 意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同

2.4.2.1. 按照索引列中的数据大小顺序存储的

2.4.3. 适用于全键值、键值范围或键前缀查找

2.4.3.1. 键前缀查找只适用于根据最左前缀的查找

2.4.4. 能够加快数据访问的速度

2.4.4.1. 在查询某些条件的数据时,存储引擎不再需要进行全表扫描

2.4.4.2. 通过比较节点页的值和要查找的值可以找到合适的指针进入下层子节点,这些指针实际上定义了子节点页中值的上限和下限

2.4.4.3. 最终存储引擎要么找到对应的值,要么该记录不存在

2.4.5. NDB集群存储引擎虽然依然使用了BTREE标识,但在其内部实际上使用了T-tree结构存储这种索引

2.4.6. InnoDB则使用的是B+tree

2.5. 自适应哈希索引

2.5.1. 当InnoDB发现某些索引值被非常频繁地被访问时,它会在原有的B-tree索引之上,在内存中再构建一个哈希索引

2.5.2. 让B-tree索引也具备了一些哈希索引的优势实现非常快速的哈希查找

2.5.3. 完全自动化的,用户无法进行控制或者配置

2.5.4. 可以通过参数彻底关闭自适应哈希索引这个特性

2.6. 全文索引

2.6.1. FULLTEXT

2.6.2. 查找的是文本中的关键词,而不是直接比较索引中的值

2.6.3. 全文索引和其他几类索引的匹配方式完全不一样

2.6.4. 全文索引更类似于搜索引擎做的事情,而不是简单的WHERE条件匹配

2.6.5. 在相同的列上同时创建全文索引和基于值的B-tree索引并不会有冲突

2.6.6. 全文索引适用于MATCH AGAINST操作,而不是普通的WHERE条件操作

3. 索引优点

3.1. 可以让服务器快速地定位到表的指定位置

3.2. 索引大大减少了服务器需要扫描的数据量

3.3. 索引可以帮助服务器避免排序和临时表

3.4. 索引可以将随机I/O变为顺序I/O

4. 高性能的索引策略

4.1. 正确地创建和使用索引是实现高性能查询的基础

4.2. 索引的选择性

4.2.1. 不重复的索引值(也称为基数,cardinality)和数据表的记录总数(#T)的比值,范围从1/#T到1之间

4.2.2. 索引的选择性越高则查询效率越高,因为选择性高的索引可以让MySQL在查找时过滤掉更多的行

4.2.3. 唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的

4.3. 前缀索引

4.3.1. 一种能使索引更小、更快的有效办法

4.3.2. 有时候为了提升索引的性能,同时也节省索引空间,可以只对字段的前一部分字符进行索引

4.3.3. 对于BLOB、TEXT或者很长的VARCHAR类型的列,必须使用前缀索引,因为MySQL并不支持对这些列的完整内容进行索引

4.3.4. 缺点

4.3.4.1. 会降低索引的选择性

4.3.4.2. MySQL无法使用前缀索引做ORDER BY和GROUP BY操作,也无法使用前缀索引做覆盖扫描

4.3.5. 既要选择足够长的前缀以保证较高的选择性,同时又不能太长(以便节约空间)

4.3.6. 计算合适的前缀长度的办法就是计算完整列的选择性,并使前缀的选择性接近完整列的选择性

4.3.7. 只看平均选择性是不够的,还有例外的情况,需要考虑最坏情况下的选择性

4.3.8. 常见的场景是针对很长的十六进制唯一ID使用前缀索引

4.4. 多列索引

4.4.1. 一个常见的错误就是,为每列创建独立的索引,或者按照错误的顺序创建多列索引

4.4.2. 在多列上独立地创建多个单列索引,在大部分情况下并不能提高MySQL的查询性能

4.4.3. 用UNION改写查询,往往是最好的办法

4.5. 选择合适的索引列顺序

4.5.1. 正确的顺序依赖于使用该索引的查询语句

4.5.1.1. 还需要考虑如何更好地满足排序和分组操作的需要

4.5.2. 索引列的顺序意味着索引首先按照最左列进行排序,其次是第二列

4.5.3. 索引可以按照升序或者降序进行扫描,以满足精确符合列顺序的ORDER BY、GROUP BY和DISTINCT等子句的查询需求

4.5.4. 当不需要考虑排序和分组时,将选择性最高的列放在前面通常是很好的

4.5.5. 经验法则考虑的是全局基数和选择性,而不是某个具体查询

4.5.6. 性能不只依赖于所有索引列的选择性(整体基数),也和查询条件的具体值有关,也就是和值的分布有关

4.5.7. 经验法则和推论在多数情况下是有用的,但要注意,不要假设平均情况下的性能也能代表特殊情况下的性能,特殊情况可能会摧毁整个应用的性能

5. 聚簇索引

5.1. 并不是一种单独的索引类型,而是一种数据存储方式

5.2. InnoDB的聚簇索引实际上在同一个结构中保存了B-tree索引和数据行

5.3. 聚簇表示数据行和相邻的键值紧凑地存储在一起

5.4. 因为无法同时把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引

5.5. 如果你没有定义主键,InnoDB会选择一个唯一的非空索引代替

5.6. 如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引

5.7. 优点

5.7.1. 以把相互关联的数据保存在一起

5.7.2. 数据访问更快

5.7.2.1. 从聚簇索引中获取数据通常比在非聚簇索引中查找要快

5.7.3. 使用覆盖索引扫描的查询可以直接使用页节点中的主键值

5.7.4. 聚簇数据最大限度地提高了I/O密集型应用的性能

5.7.4.1. 如果数据全部都放在内存中,则访问的顺序就没那么重要了,聚簇索引也就没什么优势了

5.8. 缺点

5.8.1. 插入速度严重依赖于插入顺序

5.8.2. 更新聚簇索引列的代价很高

5.8.2.1. 会强制InnoDB将每个被更新的行移动到新的位置

5.8.3. 基于聚簇索引的表在插入新行,或者主键被更新导致需要移动行的时候,可能面临页分裂(page split)的问题

5.8.4. 聚簇索引可能导致全表扫描变慢,尤其是行比较稀疏,或者由于页分裂导致数据存储不连续的时候

5.9. 最好避免随机的(不连续且值的分布范围非常大)聚簇索引,特别是对于I/O密集型的应用

5.10. 从性能的角度考虑,使用UUID作为聚簇索引会很糟糕

5.10.1. 主键字段更长

5.10.2. 占用的空间也更大

5.10.2.1. 页分裂和碎片

5.11. 对于高并发的工作负载,在InnoDB中按主键顺序插入可能会造成明显的写入竞争

5.11.1. 主键的上界会成为“热点”

5.11.2. 所有的插入都发生在这里,所以并发插入可能导致间隙锁竞争

5.12. AUTO_INCREMENT锁机制

5.12.1. 可能需要考虑重新设计表或者应用,或者更改innodb_autoinc_lock_mode配置

6. 二级索引

6.1. 二级索引(非聚簇索引)可能比想象中的要更大,因为二级索引的叶子节点包含了引用行的主键列

6.2. 二级索引访问需要两次索引查找,而不是一次

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

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

相关文章

C#__线程池的简单介绍和使用

/*线程池原理&#xff1a;&#xff08;有备无患的默认备用后台线程&#xff09;特点&#xff1a;线程提前建好在线程池;只能用于运行时间较短的线程。*/class Program{static void Main(string[] args){for (int i 0; i < 10; i){ThreadPool.QueueUserWorkItem(Download); …

【Redis】Redis作为缓存

【Redis】Redis常见面试题&#xff08;2&#xff09; 文章目录 【Redis】Redis常见面试题&#xff08;2&#xff09;1. 缓存2. Redis作为缓存2.1 缓存雪崩2.2 缓存穿透2.3 缓存击穿2.4 缓存雪崩、缓存穿透、缓存击穿的区别2.5 缓存预热2.6 如何保证缓存和MySQL双写一致 【Redis…

Java 设置免登录请求接口被拦截问题

1、在设置免登录时&#xff0c;前端将请求的路由添加到白名单后&#xff0c;请求接口还是被拦截到了&#xff0c;将请求接口也设置后还是会被拦截跳转到登录页面 通过JAVA 注解 Anonymous 进行设置匿名访问就可以了

【Unity编辑器扩展】| 自定义窗口和面板

前言【Unity编辑器扩展】| 自定义窗口和面板一、EditorWindow二、ScriptableWizard三、编辑器绘制3.1 文本输入3.2 空行3.3 滑动条、进度条3.4 枚举选择3.5 其他总结前言 前面我们介绍了Unity中编辑器扩展的一些基本概念及基础知识,还有编辑器扩展中用到的相关特性Attribute介…

华为云云耀云服务器L实例评测|服务器反挖矿防护指南

前言 本文为华为云云耀云服务器L实例测评文章&#xff0c;测评内容是 云耀云服务器L实例 反挖矿防护指南 系统配置&#xff1a;2核2G 3M CentOS7.9 之前的文章中『一文教你如何防御数据库恶意攻击』&#xff0c;我们讲到黑客如何通过攻击数据库来获取权限&#xff0c;以及我们…

pyarmor 加密许可证的使用

一 pyarmor 许可证的用处 文档&#xff1a;5. 许可模式和许可证 — Pyarmor 8.3.6 文档 试用版本有如下的限制&#xff1a; 加密功能对脚本大小有限制&#xff0c;不能加密超过限制的大脚本。 混淆字符串功能在试用版中无法使用。 RFT 加密模式&#xff0c;BCC 加密模式在试…

《确保安全:PostgreSQL安全配置与最佳实践》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

线性代数的本质(十)——矩阵分解

文章目录 矩阵分解LU分解QR分解特征值分解奇异值分解奇异值分解矩阵的基本子空间奇异值分解的性质矩阵的外积展开式 矩阵分解 矩阵的因式分解是把矩阵表示为多个矩阵的乘积&#xff0c;这种结构更便于理解和计算。 LU分解 设 A A A 是 m n m\times n mn 矩阵&#xff0c;…

【网络编程】深入理解TCP协议一(三次握手四次挥手、标记位、确认应答机制、超时重传机制)

TCP协议 1.三次握手四次挥手2.TCP协议段格式3.标记位介绍4.确认应答机制5.超时重传机制 1.三次握手四次挥手 当客户端发起连接请求时&#xff0c;SYN需要被设置位1&#xff0c;告诉服务器客户端希望建立一个链接服务器收到响应之后会回复 SYNACK&#xff0c;表示确认了客户端地…

利用Semaphore实现多线程调用接口A且限制接口A的每秒QPS为10

前段时间在群里面发现有个群友抛出一个实际需求&#xff1a;需要通过一个接口拉取数据&#xff0c;这个接口有每秒10QPS限制&#xff0c;请问如何实现数据拉去效率最大化且限制调用拉取接口每秒10PQPS&#xff1f;我觉得这个需求挺有意思的&#xff0c;跟某群友讨论&#xff0c…

莫比乌斯召回系统介绍

当前召回系统只能召回相关性高的广告&#xff0c;但不能保证该广告变现能力强。莫比乌斯做了如下两点创新&#xff1a; 在召回阶段&#xff0c;引入CPM等业务指标作为召回依据在召回阶段&#xff0c;引入CTR模型&#xff0c;从而召回更多相关性高且变现能力强的广告 参考 百度…

leetcode 26.删除有序数组中的重复项

给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c;你需要做…

5.k8s jenkins集成k8s一键发布案例

文章目录 前言一、jenkins配置1.1 jenkins配置git1.2 jenkins 配置maven1.3 jenkins配置java 二、jenkins流水线配置2.1.新增项目2.2 springboot项目配置git仓库2.3 springboot项目配置maven打包2.4 系统配置 ssh到hadoop1配置&#xff0c;也就是k8s的master节点2.6 springboot…

【多线程】常见的锁策略

常见的锁策略 1. 乐观锁 vs 悲观锁2. 读写锁 vs 普通互斥锁3. 重量级锁 vs 轻量级锁4. 自旋锁&#xff08;Spin Lock&#xff09;vs 挂起等待锁5. 公平锁 vs 非公平锁6. 可重入锁 vs 不可重入锁7. Synchronized8. 相关面试题 1. 乐观锁 vs 悲观锁 悲观锁&#xff1a; 总是假设…

安防监控系统/视频云存储EasyCVR平台视频无法播放是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

誉天在线项目~ElementPlus Tag标签用法

效果图 页面展现 <el-form-item label"课程标签"><el-tagv-for"tag in dynamicTags":key"tag"class"mx-1"closable:disable-transitions"false"close"handleClose(tag)"style"margin:5px;">…

Arcgis多值提取至点所有波段数值一样

Arcgis多值提取至点所有波段数值一样 问题描述 进行多值提取多波段后的结果&#xff0c;所有波段数值都是一样的。 原因 操作流程问题&#xff0c;输入栅格只选择了一个栅格文件 解决方案 实际上&#xff0c;每个波段都会对应一个栅格文件&#xff0c;要把这些添加进去 这…

进程地址空间(Linux虚拟内存机制)

文章目录 一.Linux进程地址空间的结构二.Linux管理进程地址空间的方式三.Linux进程使用物理内存的模型四.进程地址空间的存在意义 本章理论基于32位平台的Linux–kernel 2.6.32版本内核 一.Linux进程地址空间的结构 为了保证内存安全,现代操作系统不允许应用程序(进程)直接访问…

(二十八)大数据实战——Flume数据采集之kafka数据生产与消费集成案例

前言 本节内容我们主要介绍一下flume数据采集和kafka消息中间键的整合。通过flume监听nc端口的数据&#xff0c;将数据发送到kafka消息的first主题中&#xff0c;然后在通过flume消费kafka中的主题消息&#xff0c;将消费到的消息打印到控制台上。集成使用flume作为kafka的生产…

基于Protege的知识建模实战

一.Protege简介、用途和特点 1.Protege简介 Protege是斯坦福大学医学院生物信息研究中心基于Java开发的本体编辑和本体开发工具&#xff0c;也是基于知识的编辑器&#xff0c;属于开放源代码软件。这个软件主要用于语义网中本体的构建&#xff0c;是语义网中本体构建的核心开发…