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

如何创建高性能的索引 如何创建高性能的索引 EXPLAIN 类型分析 explain 指令可以帮助我们查看查询优化器 处理 执行计划 的一些细节信息 语法: explain + 执行计划 假如我们有这样的两张表(分类表和商品表),我们将结合explain 字段进行说明: #分类 CREATE TABLE category ( id int primary key auto_increment, name varchar(50) not null, c_desc varchar(200), create_time 阅读详情

1. 覆盖索引

1.1. 设计优秀的索引应该考虑到整个查询,而不单是WHERE条件部分

1.2. 如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们就称之为覆盖索引

1.3. 只有B-tree索引可以用于覆盖索引

1.4. 如果查询只需要扫描索引而无须回表

1.4.1. 索引条目通常远小于数据行大小,所以如果只需要读取索引,那么MySQL就会极大地减少数据访问量

1.4.2. 覆盖索引对于I/O密集型的应用也有帮助,因为索引比数据更小,更容易全部放入内存中

1.4.3. 因为索引是按照列值的顺序存储的(至少在单页内如此),所以对于I/O密集型的范围查询会比随机从磁盘读取每一行数据的I/O要少得多

1.4.4. 由于InnoDB的聚簇索引的特点,覆盖索引对InnoDB表特别有用

1.4.4.1. InnoDB的二级索引在叶子节点中保存了记录的主键值,所以如果二级索引能够覆盖查询,则可以避免对主键索引的二次查询

1.5. 在索引中满足查询的成本一般比查询记录本身要小得多

2. 使用索引扫描来做排序

2.1. 生成有序的结果

2.1.1. 通过排序操作

2.1.2. 按索引顺序扫描

2.2. 如果索引不能覆盖查询所需的全部列,那么就不得不每扫描一条索引记录都回表查询一次对应的记录

2.2.1. 基本上都是随机I/O

2.2.2. 按索引顺序读取数据的速度通常要比顺序地全表扫描慢,尤其是在I/O密集型的应用负载上

2.3. 只有当索引的顺序和ORDER BY子句的顺序完全一致,并且所有列的排序方向(倒序或正序)都一样时,MySQL才能使用索引来对结果做排序

2.4. 如果前导列为常量的时候,ORDER BY子句中的列也可以不满足索引的最左前缀的要求

2.5. 如果在WHERE子句或者JOIN子句中将这些列指定为了常量,就可以“填补”索引字段的间隙了

2.6. 使用索引做排序的另一个最重要的场景是,查询语句中同时有ORDERBY和LIMIT子句的情况

3. 重复索引

3.1. 指在相同的列上按照相同顺序创建的相同类型的索引

3.2. MySQL允许在相同列上创建多个相同的索引

3.2.1. MySQL会抛出一个警告,但是并不会阻止你这么做

3.2.2. MySQL需要单独维护重复的索引,优化器在优化查询的时候也需要逐个地进行评估,这会影响性能,同时也浪费磁盘空间

4. 冗余索引

4.1. 如果创建了索引(A,B),再创建索引(A)就是冗余索引

4.1.1. 索引(A,B)也可以当作索引(A)来使用

4.1.2. 前一个索引的前缀索引

4.1.3. 这种冗余只是对B-tree索引来说的

4.2. 如果再创建索引(B,A),则不是冗余索引,索引(B)也不是,因为B不是索引(A,B)的最左前缀列

4.3. 将一个索引扩展为(A,ID),其中ID是主键,因为主键列已经包含在二级索引中了,所以这也是冗余的

4.4. 冗余索引通常发生在为表添加新索引的时候

4.5. 大多数情况下都不需要冗余索引,应该尽量扩展已有的索引而不是创建新的索引

4.6. 出于性能方面的考虑也需要冗余索引,因为扩展已有的索引会导致其变得太大,从而影响其他使用该索引的查询的性能

4.7. 索引越多,插入的速度越慢

4.7.1. 增加新索引会导致INSERT、UPDATE、DELETE等操作的速度变慢,特别是当新增索引后达到了内存瓶颈的时候

5. 未使用的索引

5.1. 一些服务器永远不用的索引

5.2. 这样的索引完全是累赘,建议删除

5.3. 找到未使用索引的最好办法就是使用系统数据库performance_schema和sys

5.4. 在sys数据库中,在table_io_waits_summary_by_index_usage视图中可以非常简单地知道哪些索引从来没有被使用过

6. 解决冗余索引和重复索引的方法

6.1. 删除这些索引就可以了

6.2. 针对INFORMATION_SCHEMA表编写各种复杂的查询来识别这类索引

6.3. Percona工具箱中的pt-duplicate-key-checker,该工具通过分析表结构来找出冗余和重复索引

6.4. 使用Percona工具箱中的pt-upgrade工具来仔细检查计划中的索引变更

6.5. 使用MySQL 8.0的不可见索引特性,而不是直接删除索引

6.5.1. 可以通过ALTER TABLE语句,改变索引的一个标志位,使得优化器在确定执行计划时,忽略该索引

6.5.2. 如果你发现计划删除的索引依旧有非常重要的作用,可以直接把索引改成可见,而不需要重新构建该索引

7. 维护索引和表

7.1. 找到并修复损坏的表

7.1.1. 对于数据表来说,最糟糕的情况就是表被损坏了

7.1.2. 损坏的索引会导致查询返回错误的结果或者出现莫须有的主键冲突等问题,严重时甚至还会导致数据库的崩溃

7.1.3. 可以尝试运行CHECK TABLE来检查是否发生了表损坏

7.1.4. 可以使用REPAIR TABLE命令来修复损坏的表

7.1.5. 如果是InnoDB存储引擎的表发生了损坏,那么一定是发生了严重的错误,需要立刻调查一下原因

7.1.5.1. 常见的类似错误通常是由于尝试使用rsync备份InnoDB导致的

7.1.6. 如果遇到数据损坏,最重要的是找出是什么导致了损坏,而不只是简单地修复,否则很有可能还会不断地出现数据损坏的情况

7.2. 维护准确的索引统计信息

7.2.1. MySQL的优化器使用的是基于成本的模型,而衡量成本的主要指标就是一个查询需要扫描多少行

7.2.2. 可以使用SHOW INDEX FROM命令来查看索引的基数(cardinality)

7.3. 减少索引和数据的碎片

7.3.1. B-tree索引可能会产生碎片化,这会降低查询的效率

7.3.2. 碎片化的索引可能会以很差或者无序的方式存储在磁盘上

7.3.3. 如果叶子页在物理分布上是顺序且紧密的,那么查询的性能就会更好

7.3.3.1. 否则,对于范围查询、索引覆盖扫描等操作来说,速度可能会降低很多
7.3.3.2. 对于索引覆盖扫描,这一点会表现得更加明显

7.3.4. 行碎片(Row fragmentation)

7.3.4.1. 数据行被存储在多个地方的多个片段中
7.3.4.2. 即使查询只从索引中访问一行记录,行碎片也会导致性能下降

7.3.5. 行间碎片(Intra-row fragmentation)

7.3.5.1. 指逻辑上顺序的页或者行,在磁盘上不是顺序存储的
7.3.5.2. 对诸如全表扫描和聚簇索引扫描之类的操作有很大的影响,因为这些操作原本能够从磁盘上顺序存储的数据中获益

7.3.6. 剩余空间碎片(Free space fragmentation)

7.3.6.1. 指数据页中有大量的空余空间
7.3.6.2. 导致服务器读取大量不需要的数据,从而造成浪费
7.3.6.3. 可以通过执行OPTIMIZE TABLE或者导出再导入的方式来重新整理数据
7.3.6.4. 对多数存储引擎都是有效的

8. 原则

8.1. 单行访问是很慢的,特别是在机械硬盘中存储

8.1.1. 尽可能选择合适的索引以避免单行查找

8.1.2. SSD的随机I/O要快很多,不过这一点仍然成立

8.2. 按顺序访问范围数据是很快的

8.2.1. 顺序I/O不需要多次磁盘寻道,所以比随机I/O要快很多(特别是对于机械硬盘)

8.2.2. 如果服务器能够按需顺序读取数据,那么就不再需要额外的排序操作,并且GROUP BY查询也无须再做排序和将行按组进行聚合计算了

8.3. 索引覆盖查询是很快的

8.3.1. 如果一个索引包含了查询需要的所有列,那么存储引擎就不需要再回表查找行

8.4. 建议按响应时间来对查询进行分析

8.4.1. 如果一个查询无法从所有可能的索引中获益,则应该看看是否可以创建一个更合适的索引来提升性能

MySQL 创建索引的黄金法则 按需创建、聚焦核心、规避误区、动态维护。合理的索引设计能让数据库性能提升数倍,而盲目索引则会适得其反。实际应用中,需结合业务查询模式、数据量和读写比例动态调整索引策略,通过工具持续监控索引效果,才能让索引真正成为性能优化的利器。记住:最好的索引不是越多越好,而是 “刚好够用” 的索引。 阅读详情

相关推荐

Mysql(高性能索引)(三)

按照磁盘的这种性质,如果是一个页存放一个B+树的节点,自然是可以存 放很多的数据的,比如 InnoDB 里,默认定义的 B+树的节点大小是 16KB,这就是 说,假如一个 Key 是 8 个字节,那么一个节点可以存放大约 1000 个 Key,意味 着 B+数可以有 1000 个分叉。这个过程也被称为回表。这个是显而易见的,每建立一个索引都要为它建立一棵 B+树,每一棵 B+树 的每一个节点都是一个数据页,一个页默认会占用 16KB 的存储空间,一棵很大 的 B+树由许多数据页组成会占据很多的存储空间。

btcliuyj的博客 1021

MySQL高性能及性能优化技巧

Mysql的高性能优化和架构设计. 索引设计,查询方式,mysql底层结构

欢迎来到烟火气知识小天地!这里记录生活、工作中的 “小麻烦”,从软件故障到生活难题,我会毫无保留分享解决思路与方法,愿成为你排忧解难时的温暖参考,伴你在解决问题路上稳步前行。 3755

医疗AI Agent实战:从零搭建一个能看病的智能助手(附完整代码)

本文详细介绍了如何从零搭建一个医疗AI Agent智能助手,涵盖核心架构设计、症状推理引擎开发、安全与合规实现以及系统集成等关键环节。通过完整的代码示例和实战案例,帮助开发者快速构建具备医疗咨询能力的智能Agent,提升医疗服务的效率和质量。

ss78901的博客 464

高性能MYSQL

文章目录一、MYSQL架构与历史1.并发控制1.1 读写锁1.2 锁粒度2.事务2.1 隔离级别2.2 死锁2.3 事务日志3.多版本并发控制(MVCC) 一、MYSQL架构与历史 1.并发控制 1.1 读写锁 在处理并发读或者写时,可以通过实现一个由两种类型的锁组成的锁系统来解决问题。 这两种类型的锁通常被称为共享锁和排他锁,也叫读锁或者写锁。 1.2 锁粒度 一种提供共享资源并发性的方式就是让锁定对象更有选择性,尽量只锁定需要修改的部分数据,而不是所有的资源。 更理想的方式是,只对会修改的数据片进行精

weixin_43829169的博客 902

RabbitMQ的使用(JAVA)

Java快速上手的MQ上线!

.............. 1万+

AD18 PCB模块的Copy

在PCB布局时,时常会将元器件先分模块进行排布,最后才会进行总体的布局,在局部布局的时候,想要移动一个模块的器件总是很麻烦,需要选中全部才能进行移动,有些时候还有选漏的情况,所以会将局部布局的模块把它看做一个整体进行移动,效果如下,元件,布线,铜皮,过孔以及元件编号的位置摆放都和源模块一模一样。4、再选中需要复用的模块内的元件,按照第3步的顺序排序,粘贴刚刚复制的Channel Offset参数。在PCB布局时,有多个模块原理图是一模一样的情况,我们可以只画一个模块,之后灵活应用模块,进行copy。

qq_53859658的博客 3237

MySQL高性能

1.默认存储引擎InnerDB2.默认字符集utf8mb43.关闭大小写4.开启per-table表空间表与表之前多对多的关系可以使用交叉表。

sinat_33543451的博客 1370

液晶屏LVDS接口:【图文详讲】

​LVDS(Low Voltage Differential Signaling,即低电压差分信号)接口又称RS-644总线接口,是20世纪90年代才提出的一种数据传输和接口技术。LVDS接口是美国NS美国国家半导体公司为克服以TTL电平方式传输宽带高码率数据时功耗大,电磁干扰大等缺点而研制的一种数字视频信号传输方式

weixin_66299220的博客 1万+

高性能MySQL(InnoDB)

整理一些InnoDB的知识点

技术分享 1226

NeuralKG的安装及简单demo使用(浙江大学开源知识图谱表示学习工具)

记录NeuralKG的安装和使用,以及解决windows系统下的运行demo.py出现的问题。

m0_46621271的博客 1397

YOLOv11 改进 - 注意力机制 | 空间增强注意力SEAM(Spatially Enhanced Attention Module)提升遮挡场景检测鲁棒性

本文介绍了分离与增强注意力模块(SEAM)在YOLOv11中的结合应用。SEAM模块旨在增强面部特征学习能力,特别是处理面部遮挡问题。它采用多头注意力机制强调面部区域、抑制背景区域,第一部分使用深度可分离卷积减少参数并学习通道重要性,通过1x1卷积增强通道联系,利用两层全连接网络融合通道信息,经指数归一化后作为注意力权重与原始特征相乘。我们将SEAM集成到YOLOv11的检测头中,并进行相关注册和配置。实验表明,该方法有助于提升模型检测性能。

魔改工程师的博客 1664

高性能MySQL(呕心沥血整理万字长文)

高性能MySQL 文章目录高性能MySQL一、 引言二、 架构2.1 谈谈技术选型依据2.2 一次并不特别成功的技术选型2.3 聊聊MySQL的逻辑架构2.4 小结三、 顶层设计3.1 设计表的坑3.1.1 太多的列3.1.2 太多的关联3.1.3 过度使用枚举3.1.4 范式和反范式3.1.5 缓存表、汇总表3.1.6 Alter Table3.1.7 小结3.2 索引设计3.2.1 还是那棵树3.2.2 三星系统3.2.3 聚簇索引3.2.4 覆盖索引3.2.5 索引和排序3.2.6 冗余索引和重复索引

老邋遢的菜园子 1万+

【python股票价格预测】基于LSTM(长短期记忆网络)的股票价格预测(附python代码)

【python股票价格预测】基于LSTM(长短期记忆网络)的股票价格预测(附python代码)

k8291121的博客 1011

MySQL之创建索引

MySQL之创建索引

weixin_52690231的博客 7581

爆破shadow文件密码脚本(完成版)

由于添加了一个for循环,再稍作修改,让password not found!print(f"Trying password:")显示爆破的密码和过程。将代码中的password="123456"替换成下面代码。line.strip()函数首尾去空格。

m0_56578216的博客 771

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

高性能MySQL-创建高性能索引

如有侵权,请联系~如有错误,也欢迎批评指正~本篇文章大部分是来自学习《高性能MySQL》的笔记。

m0_50149847的博客 993

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

MySQL性能调优(五):MySQL中的索引(B+树索引、哈希索引、全文索引、索引使用、高性能索引创建策略)

能表示的整数范围当然也是依次递增,如果我们想要对某个整数列建立索引的话,在表示的整数范围允许的情况下,尽量让索引列使用较小的类型,比如我们能使用INT就不要使用BIGINT,能使用NEDIUMINT就不要使用INT,这是因为数据类型越小,在查询时进行的比较操作越快(CPU层次)数据类型越小,索引占用的存储空间就越少,在一个数据页内就可以放下更多的记录,从而减少磁盘/0带来的性能损耗,也就意味着可以把更多的数据页缓存在内存中,从而加快读写效率。唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 4万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Mysql 创建索引

数据库建立索引常用的规则如下: 1、表的主键、外键必须有索引;2、数据量超过300的表应该有索引; 3、经常与其他表进行连接的表,在连接字段上应该建立索引; 4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引; 5、索引应该建在选择性高的字段上; 6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引; 7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替: A、正确选择复合索引中的主列字段,一般是选择性较好的字段; B、复合索引的几个字段是否经常同...

艾利克斯冰的博客 1万+

MySQL-索引的创建

索引分类 按照功能逻辑上分类:普通索引、唯一索引、主键索引、全文索引 按照物理实现方式分类:聚簇索引和非聚簇索引 按照作用字段个数分类:单列索引和联合索引 1. 普通索引 在创建普通索引时,不附加任何限制条件,只是用于提高查询效率 这类索引可以创建在任何数据类型中,其值是否唯一和非空,要由字段本身的完整性约束条件决定。建立索引以后,可以通过索引进行查询 例如,在表student的字段name上建立一个普通索引,查询记录时就可以根据该索引进行查询 2. 唯一索引 使用UNIQUE参数可以设置索引

zl979899的博客 4181

一文搞定:MySQL索引,如何创建高性能索引

索引基本分为B+树和全文索引,在MySQL中使用B+树较多,重点说说B+树索引在选索引和创建索引时,有三点要素单行访问很慢,特别是在机械存储中按顺序访问范围数据是很快的,有两个原因顺序I/O不需要多次磁盘寻找按顺序读取数据,不需要再额外的排序操作并且GROUP BY查询也无须再做排序和将行按组进行聚合计算了索引覆盖查询是很快的。如果一个索引包含了查询需要的所有列,那么存储引擎就不需要再回表查找行。

Minxinbb 959

读高性能MySQL(第4版)笔记21_读后总结与感想兼导读

总结与感想和导读

lyingSeven的博客 996

MySQL精进之路——创建高性能的索引

本文介绍了MySQL索引的基础知识、类型及高性能索引策略。主要内容包括: 索引基础:索引是帮助存储引擎快速查找记录的数据结构,B-Tree是最常见索引类型,支持全键值、范围查询等,但需遵循最左前缀原则。 索引类型: B-Tree索引:适用于大多数查询场景,但有限制条件 哈希索引:仅支持精确匹配,Memory引擎默认使用 全文索引:用于文本关键词搜索 空间索引:支持地理数据 高性能索引策略: 避免在索引列上使用函数或表达式 合理使用前缀索引优化长字段 多列索引要考虑列顺序和选择性 聚簇索引影响数据存储方式,需

weixin_52344200的博客 983

MySQL之创建高性能的索引(四)

MyISAM表支持空间索引,可以用作地理数据存储。和B-Tree索引不同,这类索引无须前缀查询。空间索引会从所有维度来索引数据。查询时,可以有效地使用任意维度来组合查询。必须使用MySQL的GIS相关函数如MBRCONTAINS()等来维护数据。MySQL的GIS支持并不完善,所以大部分人都不会使用这个特性。开源关系数据库系统中对GIS的解决方案做得比较好的是PostgreSQL的PostGIS.

Cover_sky的博客 1329

MySQL 高性能索引创建

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

学习学习学习学习 1411
上一篇: 读高性能MySQL(第4版)笔记08_创建高性能索引(上)
下一篇: 学信息系统项目管理师第4版系列07_项目管理知识体系
躺柒
博客等级 码龄4年 7004粉丝 1317原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值