当前位置: 首页 > news >正文

mysql索引讲解

mysql索引讲解

sql语句的执行效率

不同的sql语句执行的效率差别非常大。执行效率差的sql语句会严重影响系统性能,同时,可能会因为长期持有行级别和表级别的锁,导致其他sql语句陷入持续性等待。

所以在应用一个sql语句的时候,我们要先用explain命令,解释其是否能高效的完成任务。

explain命令显示出的执行计划中字段有:

  • possible_keys :可能用到的索引;
  • key:实际用的索引;
  • key_len 索引的长度
  • rows 表示扫描的数据行数。
  • type 表示数据扫描类型

type字段描述的是找到所需数据的扫描方式,常见的扫描类型的执行效率,从高到低分为:

  • All:全表扫描,未使用任何索引,需要扫描​所有数据页,要最大限度避免进行全表扫描。

  • index:全索引扫描,遍历整个索引树,不需要回表(查询字段全在索引中)因此,性能优于 ALL,但依然不理想。

  • range:在索引上执行 ​范围扫描,范围越小性能越好。

  • ref:使用 ​非唯一索引 进行查找,可能返回 ​多条记录。其索引列允许重复值,性能取决于索引区分度(不同值越多性能越好)

  • eq_ref:在 ​多表 JOIN 查询 中,使用主键或唯一索引进行 ​一对一匹配,每个 JOIN 操作 ​只匹配到1条记录,常见于主键关联的 JOIN 查询

  • const:最高效,通过主键或唯一索引定位查询结果,最多返回1条。

索引优化的方案

1、 覆盖索引。

覆盖索引是指查询所需字段 ​全部包含在索引中,无需回表查询数据页。通过减少磁盘I/O次数显著提升性能。示例:

ALTER TABLE users 
ADD INDEX idx_cover_username (username, age, gender);

设置联合索引,通过username,就可以直接查询到用户的年龄和性别。

2、 前缀索引。

使用某个字段中字符串的前几个字符建立索引。可以增加一个索引页中存储的索引值,有效提高索引的查询速度。例如,对邮箱的前7个字段

ALTER TABLE users 
ADD INDEX idx_email_prefix (email(7));

3、 主键索引自增

自增主键保证数据 ​物理有序存储,减少页分裂和碎片。每次插入新记录时,主键值自动递增,保证新数据始终追加到B+树的最右侧叶子节点。

​4. 索引下推优化

如果查询语句为,多条件查询且存在联合索引。在存储引擎层提前过滤数据,减少回表次数。

索引失效的场景

虽然建立了高效的索引,但是某些sql语句会导致索引失效,要避免这些情况。

1、 使用左右模糊匹配

2、 在查询中,对索引做了计算、函数、类型转换等操作。会使索引失效,

3、在联合索引中,没有遵循最左优先的方式进行匹配,会导致联合索引失效。因为联合索引是局部有序的。

4、在where的子句中,如果O在OR前的条件列是索引列,在列后的索引列不是索引列。那么就会失效。

所以在查询中,可以尽量使用UNION查询,替代OR。

SELECT * FROM products WHERE category_id = 5
UNION ALL
SELECT * FROM products WHERE price > 1000 AND category_id <> 5;

什么时候创建索引

索引是需要动态维护和存储的,什么样的索引是一个好索引呢?怎么判定是否应该对该字段建立索引?

1、 区分度优先原则。首先要对区分度大的字段建立索引。建立联合索引时,应该把区分度大的放在前边。
区分度计算公式:

SELECT 
  COUNT(DISTINCT gender)/COUNT(*) AS gender_distinct,     
  COUNT(DISTINCT mobile)/COUNT(*) AS mobile_distinct      
FROM users;

2、经常用于where查询和GROUP BY 和 ORDER BY的字段,这样查询的时候,不需要再做一次排序。

3、不用经常性更新的字段,如果索引字段频繁修改,为了维护B+树,会导致频繁地重建索引。

相关文章:

  • 深入理解 Reactor Netty 线程配置及启动命令设置
  • 洛谷 P1068 [NOIP 2009 普及组] 分数线划定 python
  • rust学习笔记14-函数
  • SSO单点登录
  • FLASK和GPU依赖安装
  • Ollama+OpenManus详细部署实战
  • 【SegRNN 源码理解】验证集和测试集
  • C语言【内存函数】详解加模拟实现
  • 大模型最新面试题系列:微调篇之微调框架(一)
  • 78. Harmonyos NEXT 懒加载数据源实现解析:BasicDataSource与CommonLazyDataSourceModel详解
  • 背诵--2
  • 【商城实战(33)】解锁版本迭代与更新策略
  • 敏捷开发在中小团队中的应用与挑战:实战指南与避坑手册
  • 对Spring的每种事务传播级别的应用场景和失效场景
  • 20250315在windows10下开热点步骤
  • linux系统CentOS 7版本搭建NFS共享存储
  • 为什么HashMap 头插法会造成死锁
  • JDBC 核心 API 全面解析与高效数据库操作
  • 如何用正则表达式爬取古诗文网中的数据(python爬虫)
  • K8S下nodelocaldns crash问题导致域名请求响应缓慢
  • 打击网络侵权盗版!四部门联合启动“剑网2025”专项行动
  • 马上评|文玩字画竞拍轻松赚差价?严防这类新型传销
  • 河南:响鼓重锤对违规吃喝问题露头就打、反复敲打、人人喊打
  • 机构发布“2025中国高职院校排名”
  • 牛市早报|4月新增社融1.16万亿,降准今日正式落地
  • 体坛联播|博洛尼亚时隔51年再夺意杯,皇马逆转马洛卡