MySQL 笔记 - 索引优化

关于mysql索引的优化笔记 为什么使用索引 1、大大减少了服务器需要扫描的数据量 2、帮助服务器避免排序和临时表 3、将随机io变成顺序io 索引的用处 1、快速查找匹配WHERE子句的行 2、从consideration中消除行,如果可以在多个索引之间进行选择,mysql通常会使用找到最少行的索引 3、如果表具有多列索引,则优化器可以使用索引的任何最左前缀来查找行 4、当有表连接的时候,从其他表检索行数据 5、查找特定索引列的min或max值 6、如果排序或分组时在可用索引的最左前缀上完成的,则对表进行排序和分组 7、在某些情 阅读详情

巧妙的使用 Explain

看一条 SQL 语句的性能,可以使用explain关键字查看语句性能,这里说一下其中的type字段的部分含义,

all,即全表扫描,说明这个 SQL 语句没有使用到索引,有可能是表本身没有创建索引,也可能是因为 SQL 语句导致没有使用索引

range,说明使用的是有范围的索引扫描,性能优于 index

index,这里说明使用了索引,这种情况下,如果 extra 列中的值为 Using index,这种情况是索引覆盖,索引覆盖的意思是,我们想要查询的数据,索引中已经都存在啦,这种情况下就不需要再回表取数据了

ref,说明条件列使用了索引,但是不是主键和 unique,所以这里即使使用了索引,索引值不唯一,有重复的情况

eq_ref,相对于 ref 来说就是使用的是唯一索引,对于每个索引键值,只有唯一的一条匹配记录

const/system,单表中最多只有一条匹配行,查询起来非常迅速,所以这个匹配行中的其他列中的值可以被优化器在当前查询中当做常量来处理。例如根据主键或者唯一索引进行的查询

index_merge,说明使用了 MySQL 的索引合并的优化方法,当使用合并索引的时候,就需要检查一下我们所创建的索引是否为多个单列索引

如何有效的优化索引

使用索引的时候,索引必须作为独立的列出现

作为独立的列的意思是,索引不能作为表达式的一部分,也不能作为函数的参数出现,否则索引会失效,原因是 MySQL 无法自动解析表达式以及参数,所以也就无法使用索引了,索引失效还有以下几种情况:

条件中使用is null或者is not null会导致索引失效,原因是索引中不会存储null

使用%like,因为 MySQL 是左匹配,使用模糊查询时如果以%开头会导致全表查询

使用多列索引的时候,如果索引顺序不是建立索引的顺序,或者跳过第一个索引直接使用后面的索引,也会导致索引失败,原因依然是 MySQL 是左匹配~

条件中包含or时,只有所有列都是单独索引时才会使用索引

如何创建有效的索引

如果需要索引很长的字符串,此时需要考虑前缀索引

前缀索引即选择所需字符串的一部分前缀作为索引,这时候,需要引入一个概念叫做索引选择性,索引选择性是指不重复的索引值与数据表的记录总数的比值,可以看出索引选择性越高则查询效率越高,当索引选择性为1时,效率是最高的,但是在这种场景下,很明显索引选择性为1的话我们会付出比较高的代价,索引会很大,这时候我们就需要选择字符串的一部分前缀作为索引,通常情况下一列的前缀作为索引选择性也是很高的

如何选择前缀

计算该列完整列的选择性,使得前缀选择性接近于完整列的选择性

使用多列索引

尽量不要为多列上创建单列索引,因为这样的情况下最多只能使用一星索引,这样的话,不如去创建一个全覆盖索引,在多列上创建单列索引大部分情况下并不能提高 MySQL 的查询性能,MySQL 5.0 中引入了合并索引,在一定程度上可以表内多个单列索引来定位指定的结果,但是 5.0 以前的版本,如果 where 中的多个条件是基于多个单列索引,那么 MySQL 是无法使用这些索引的,这种情况下,还不如使用 union

选择合适的索引列顺序

经验是将选择性最高的列放到索引最前列,可以在查询的时候过滤出更少的结果集

但这样并不总是最好的,如果考虑到 group by 或者 order by 等情况,再比如考虑到一些特别场景下的 guest 账号等数据情况,上面的经验法则可能就不是最适用的

覆盖索引

所谓覆盖索引就是指索引中包含了查询中的所有字段,这种情况下就不需要再进行回表查询了

MySQL 中只能使用 B-Tree 索引做覆盖索引,因为哈希索引等都不存储索引的列的值,覆盖索引对于 MyISAM 和 InnoDB 都非常有效,可以减少系统调用和数据拷贝等时间

Tips:减少select *操作

使用索引扫描来做排序

MySQL 生成有序的结果有两种方法:通过排序操作,或者按照索引顺序扫描;使用排序操作需要占用大量的 CPU 和内存资源,而使用index性能是很好的,所以,当我们查询有序结果时,尽量使用索引顺序扫描来生成有序结果集

怎样保证使用索引顺序扫描:

索引列顺序和 ORDER BY 顺序一致

所有列的排序方向一致

如果关联多表,那么只有当 ORDER BY 子句引用的字段全部为第一张表时,才能使用索引做排序,限制依然是需要满足索引的最左前缀要求

压缩索引

上一篇将索引结构的文章提到了,MyISAM 中使用了前缀压缩技术,会减少索引的大小,可以在内存中存储更多的索引,这部分优化默认也是只针对字符串的,但是可以自定义对整数做压缩

这个优化在一定情况下性能比较好,但是对于某些情况可能会导致更慢,因为前缀压缩决定了每个关键字都必须依赖于前面的值,所以无法使用二分查找等,只能顺序扫描,所以如果查找的是逆序那么性能可能不佳

减少重复、冗余以及未使用的索引

MySQL 的唯一限制和主键限制都是通过索引实现的,所以不需要在同一列上增加主键、唯一限制再创建索引,这样是重复索引

再举个例子,如果已经创建了索引(A,B),那么再创建索引(A)的话,就属于重复索引,因为 MySQL 索引是最左前缀,所以索引(A,B)本身就可以使用索引(A),但是创建索引(B)的话不属于重复索引

尽量减少新增索引,而应该扩展已有的索引,因为新增索引可能会导致 INSERT、UPDATE、DELETE 等操作更慢

可以考虑删除没有使用到的索引,定位未使用的索引,有两个办法,在 Percona Server 或者 MariaDB 中打开 userstates 服务器变量,然后等服务器运行一段时间后,通过查询 INFORMATION_SCHEMA.INDEX_STATISTICS 就可以查询到每个索引的使用频率

索引和锁

之前讲索引结构的时候说过,InnoDB 支持行锁和表锁,默认使用行锁,而 MyISAM 使用的是表锁,所以使用索引可以让查询锁定更少的行,这样也会提升查询的性能,如果查询中锁定了1000行,但实际只是用了100行,那么在 5.1 之前都需要提交事务之后才能释放这些锁,5.1 之后可以在服务器端过滤掉行之后就释放锁,不过依然会导致一些锁冲突

减少索引和数据碎片

首先我们需要了解一下为什么会产生碎片,比如 InnoDB 删除数据时,这一段空间就会被留空,如果一段时间内大量删除数据,就会导致留空的空间比实际的存储空间还要大,这时候如果进行新的插入操作时,MySQL 会尝试重新使用这部分空间,但是依然无法彻底占用,这样就会产生碎片

产生碎片带来的后果当然是,降低查询性能,因为这种情况会导致随机磁盘访问

可以通过 OPTIMIZE TABLE 或者重新导入数据表来整理数据

总结

数据库的索引这部分要讲的话实在是太多了~绝大部分情况都需要结合实际情况,如果我们可以更多的了解数据库索引本身的一些原理,那么对于优化会有一些帮助~巧妙地使用 explain 分析自己所写的 SQL 语句,可以更好的进行优化。

进群:可以领取免费的架构师学习资料。

进群:了解最新的学习动态

进群:了解最新的阿里,京东招聘资讯

进群:获取更多的面试资料

1、具有1-5工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加群。

2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加群。

3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加群。

4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加群。

5. 群号:835638062 点击链接加入群:https://jq.qq.com/?_wv=1027&k=5S3kL3v

6.阿里Java高级大牛直播讲解知识点,分享知识,上面五大专题都是各位老师多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

Mysql索引原理及优化——岁月云实战笔记 根据这个博主的视频学习,对现在的项目中mysql进行优化,我要向这个博主致敬,之前应用居多,理论所知甚少,于是将学习到东西,应用下来,看看是否有好的改观。 阅读详情

相关推荐

MySQL索引使用与性能优化实战笔记

在这个例子中,order_id既是主键,也是聚集索引。

weixin_42515392的博客 702

一文带你你搞懂索引如何优化!!!

前言索引的相信大家都听说过,但是真正会用的又有几人?平时工作中写SQL真的会考虑到这条SQL如何能够用上索引,如何能够提升执行效率?此篇文章详细的讲述了索引优化的几个原则,只要在工作中能...

码猿技术专栏 4175

Windows 11 部署 Docker Desktop:从 WSL 报错到服务配置的完整排障实录

本文详细记录了在Windows 11上部署Docker Desktop时遇到的WSL报错问题及完整解决方案。从Hyper-V配置、BIOS设置到系统服务检查,提供了一系列实用命令和排查步骤,帮助开发者快速解决'Unexpecter WSL error'等常见问题,实现Docker与WSL2的稳定运行。

weixin_30687051的博客 123

索引优化方法

1.关联查询优化保证被驱动表的JOIN字段已经创建了索引 需要JOIN 的字段,数据类型保持绝对一致。LEFT JOIN 时,选择小表作为驱动表, 大表作为被驱动表 。减少外层循环的次数。INNER JOIN 时,MySQL会自动将 小结果集的表选为驱动表 。选择相信MySQL优化策略。 能够直接多表关联的尽量直接关联,不用子查询。(减少查询的趟数) 不建议使用子查询,建议将子查询SQL拆开结合程序多次查询,或使用 JOIN 来代替子查询。衍生表建不了索引。2.子查询优化MySQL从4.1版本开始支持子查询

qq_52896771的博客 4747

TP-LINK电信定制摄像头刷机教程:解锁官方功能与固件升级

固件是嵌入式设备的操作系统,控制着硬件的基础功能。其工作原理是通过更新或替换存储在设备非易失性存储器中的程序代码,从而改变设备的行为和功能。这项技术的核心价值在于赋予用户对设备的完全控制权,能够解除厂商或运营商的软件限制,实现功能自定义、性能优化和安全更新。在智能家居、网络设备和物联网领域,固件升级与刷机是常见的工程实践,用于修复漏洞、增加新特性或适配不同平台。本文聚焦于利用TFTP恢复模式这一通用网络设备维护机制,针对TP-LINK电信定制版摄像头,提供一套完整的刷机方案,将设备刷入官方通用版固件,以解除

weixin_34205826的博客 502

解密QtIFW高级配置:用XML+JS打造品牌化安装界面(含动态水印/多语言技巧)

本文深入探讨了如何利用Qt Installer Framework(QtIFW)的高级配置功能,通过XML和JavaScript打造专业、品牌化的软件安装界面。文章详细解析了企业级项目目录结构设计、模块化配置文件编写、CSS样式表深度定制、动态水印实现以及智能多语言许可证管理等核心技巧,旨在帮助开发者超越基础打包,为Windows和Linux平台构建具有卓越用户体验的安装程序。

read5的博客 531

优化索引的方法

为了避免索引隐式转换带来的性能问题,在编写 SQL 查询时,应注意查询条件中数据类型的匹配,尽量进行显式的类型转换,确保与字段的数据类型一致。由于索引通常需要在内存和磁盘中进行存储和处理,较小的索引字段大小意味着在一个索引页中能够容纳更多的索引值,从而提高索引的查询速度。联合索引按照字段在索引中的定义顺序进行匹配,如果查询条件的字段顺序与联合索引的顺序不一致,可能无法充分利用索引的优势。例如,对于一个包含很长字符串描述的字段,如文章的内容摘要,如果直接对整个字符串创建索引,会占用大量的空间。

lu_la_la_的博客 4132

Kettle入门指南:从安装到数据转换实战

本文提供Kettle(Pentaho Data Integration)的完整入门指南,涵盖从Java环境安装、软件配置到核心概念(转换与作业)的详细解析。通过实战案例,手把手教你如何将文本文件数据导出到Excel,并连接MySQL数据库进行数据导入,帮助你快速掌握这一强大ETL工具的基本使用,实现高效数据搬运与转换。

weixin_29266647的博客 451

Mysql索引优化实战一

文章目录一、示例表一个不容易理解的综合例子:Mysql如何选择合适的索引常见sql深入优化Order by与Group by优化优化总结:Using filesort文件排序原理详解索引设计原则索引设计实战总结 一、示例表 CREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名', `age` int(11) NOT

Netgrow的博客 612

Unable to negotiate with XXXX port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss

打开ssh_config此文件,滑动到最下面,新增自己git主机地址(这里我直接默认*)执行命令 git clone git@xxxxxxxxxxxxx.git。代码仓库已经添加了ssh公钥之后,克隆代码到本地时就报了这个问题。首先是找到git安装目录(根据自己安装时选项,找到这个目录)再进入ssh目录,找到 ssh_config 配置文件。配置完成后,保存配置文件后再次去clone代码。直接复制下面这一段到文件中最底部位置即可。然后进入 etc目录,找到ssh目录。终于可以克隆下来了。

萌兔兔MMQ!! 3360

OpenCv —— 检测车牌号(附完整源码)

OpenCv —— 检测车牌号

5601

MySQL索引优化(超详细)

MySQL索引优化,涉及到索引介绍,性能分析,查询优化,慢查询日志。

weixin_55816781的博客 9379

csp信奥赛C++标准模板库STL案例应用1

csp信奥赛C++标准模板库STL案例应用1

王老师青少年编程 1384

mysql索引优化笔记

mysql官方对索引的定义为:索引(Index)是帮助MySql高效获取数据的数据结构。可以得到索引的本质:索引是数据结构。 可以理解为“排好序的快速查找数据结构”。 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。下图就是一种可能的索引方式示例: 为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用

qq_34378496的博客 774

基于深度学习 YOLOv11 的快递包裹检测系统(Python + PySide6 界面 + 训练代码)

成为亟需优化的重要环节。随着电子商务的快速发展,物流行业面临着越来越大的压力,为了解决这些问题,我们提出了一种。目标检测算法,实现快递包裹的。的界面,供用户进行实时监控。本项目的主要目标是利用。

斌擎科技 764

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

MySQL索引优化策略与笔记

MySQL作者:曹理鹏原文地址:https://icocos.github.io面试知识,数据库索引优化1.什么问题?索引有什么代价?哪些场景下你需要建索引?或者有时候反过来问,哪些场景...

Coder编程的博客 580

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

存储引擎、索引、SQL优化(MySQL笔记第四期)

当字段类型为字符串(varchar、text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时会浪费大量的磁盘IO,影响查询效率.此时可以只将字符串的一部分进行前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。InnoDB:是MySQL的默认存储引擎,支持事务、外键,如果应用对于事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那InnoDB存储引擎是很适合的操作。如果索引了多列(联合索引),要遵守最左前缀法则。

2403_87139271的博客 1307

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

lwip-2.0.3

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

mysql 索引优化笔记

索引的类型:普通索引,唯一索引,主键索引,组合索引 1、选择索引列 创建索引简单,但是在哪些列上创建索引则需要好好思考。可以考虑在where字句中出现列或者join字句中出现的列上建索引。 2、最左前缀原则     联合索引(name,age,phoneNum) ,B+树是按照从左到右的顺序来建立搜索树的。如('张三',18,'18668247652')来检索数据的时候,B+树会优先匹配n

net343的博客 275

mysql学习笔记-索引优化与查询优化

1.8 is null可以使用索引,is not null无法使用索引。因为classid 使用了范围条件,导致name索引没用上。1.4 计算、函数、类型转换(自动或手动)导致索引失效。不同的字符集进行比较前需要转换,会造成索引失效。1.10 OR前后存在非索引的列,索引失效。= 或者<>)索引失效。1.9 like以通配符%开头索引失效。1.6 范围条件右边的列索引失效。1.5 类型转换导致索引失效。1.1 全值匹配我最爱。1.2 最佳左前缀法则。

weixin_37693463的博客 512

MySQL索引优化 笔记

少取字段,建立合理的索引 表优化: 1 定长与变长分离 如果都是定长 查询比较快 因为每一行的字节都是固定的 fixed 2 常用字段和不常用字段要分离 用户表 常用 放主表 个人介绍不常用 还比较长 可以单放一张表 3 在1对多 需要关联统计的字段上,分析字段的查询场景,查询频率低的字段单拆出来 添加冗余...

dengxianji1647的博客 128

mysql学习笔记之索引优化

索引优化批量新增索引优化与建立索引思想分页优化复习优化函数索引Max函数与分组问题 内容来源为六星教育,这里仅作为学习笔记 批量新增 Java环境安装参考地址:https://www.cnblogs.com/duanzq/p/12640335.html 索引优化与建立索引思想 分页优化复习 问题1:查询商品数据-分页查询 select * from products limit 10000000,10;–用时7s 优化思想: 可以通过id进行查询 select * from products where i

小鱼AS的博客 256

mysql优化笔记 ——表的设计及索引优化

mysql优化笔记概览表的设计合理化数据类型选择整数类型实数类型VARCHAR和CHAR类型BLOB和TXET类型ENUM —— 使用枚举代替字符串类型DATETIME和TIMESTAMPschema设计中的陷阱添加合理且适当的索引独立的列前缀索引和索引的选择性多列索引 和 列顺序聚簇索引索引操作添加查询索引删除索引的实现原理及优缺点 概览 表的设计合理化(符合3NF,有时需要反3NF) 添加合...

qq_28376741的博客 373

MySQL学习笔记之索引优化与查询优化

本文记录了MySQL学习笔记中的查询优化和索引优化。索引优化部分列举并分析了索引失效的各种场景,查询优化部分包括了关联查询优化、子查询优化、排序优化、分组查询优化、分页查询优化,还介绍了覆盖索引、索引下推等概念和使用场景。最后,对比了普通索引和唯一索引、count(*)、count(1)和count(字段)的效率、exists和in的区分等优化手段。

四国棋客 1344

MySQL索引优化笔记

    索引是数据库优化中最常用也是最重要的手段之一。通过索引通常可以帮助用户解决大多数的SQL性能问题。     在对数据库进行查询select操作时,要知道查询效率的高低,我们可以通过explain 或 desc命令来分析MySQL是如何执行select语句的。确定问题后,再可以采取相应的索引优化措施。MyISAM存储引擎的表的数据文件和索引文件是自动分开存储的。在目前MySQL中索引

郑红涛的专栏 653

数据库优化MySQL优化之索引学习笔记

索引: index帮助mysql高效获取数据的数据结构, 排好序的快速查找数据结构 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在数据结构的基础上实现高级查找算法 索引多指B树(多路搜索树,并不一定是二叉树) 优势: 类似大学图书馆书目索引,提高数据检索的效率,降低数据库的IO成本 降低排序成本,降低cpu消耗 劣势: 索引也是一张表,该表保存了主键与索引字段,并指向实体类的记录,故索引列也是要占用空间的。 建立索引虽然提高的查询速度,同时也降低

weixin_44107140的博客 1202
上一篇: MySQL 笔记 - 事务&锁
下一篇: Dubbo的微内核机制
普通网友
博客等级 码龄8年 55粉丝 197原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值