【MySQL-索引调优】02:单列索引

1-问题

查询:

sql 复制代码
EXPLAIN SELECT * FROM orders WHERE user_id = 1234;

发现:

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE orders ALL 99520 10 Using where

分析:

  • select_type = SIMPLE:说明这是一个简单查询,没有子查询或UNION

  • table = orders :查询的表就是orders

  • partitions = NULL:没有分区

  • type = ALL:这是最关键的,表示执行计划是 全表扫描。也就是说它没有用索引,而是把整张表都扫一遍

  • possible_keys = NULL:没有可用的索引

  • key = NULL:关键,实际使用的索引也是空的,说明没有用索引

  • key_len = NULL:索引长度为空

  • ref = NULL:没有引用索引

  • rows = 99520:关键,预估需要扫描大约 99,520 行数据

  • filtered = 10:表示大约只有 10% 的数据符合条件

  • Extra = Using where :说明是靠WHERE user_id = 1234这个条件来过滤

查询在orders表上做了全表扫描 ,效率比较低。如果orders表很大,性能会很差。原因是user_id字段没有索引,所以数据库只能把整张表读一遍再过滤

2-优化

  • 执行计划显示 type = ALL,也就是全表扫描
  • possible_keys = NULL,说明数据库认为没有合适的索引可以用
  • 查询条件是WHERE user_id = 1234`

可以新增user_id索引,提高查询速度

sql 复制代码
# 新增索引
CREATE INDEX idx_user_id ON orders(user_id);
# 再次运行
EXPLAIN SELECT * FROM orders WHERE user_id = 1234;

结果为:

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE orders ref idx_user_id idx_user_id 9 const 8 100

分析:

  • type = ref :这表示查询使用了非唯一索引(普通索引),通过索引来定位行,而不是全表扫描。相比之前的ALL,性能提升很大

  • possible_keys = idx_user_id :数据库识别到可以用idx_user_id这个索引

  • key = idx_user_id :实际使用的索引就是你刚建的idx_user_id

  • key_len = 9 :索引字段的长度(这里是user_id的存储长度)

  • ref = const :说明查询条件是一个常量(user_id = 1234),直接用这个值去索引里查

  • rows = 8:数据库预估只需要扫描大约8行,而不是之前的99,520行

  • filtered = 100:表示这些行几乎全部符合条件

相关推荐
涛思数据(TDengine)5 分钟前
TDengine TSDB 3.4.3.3 上线:流计算分层闭环、虚拟表跨层引用,查询关联一次写完
数据库·人工智能·数据分析·时序数据库·tdengine·工业
远方16097 分钟前
118-五大进程LGWR DBWn CKPT SMON PMON 与存储故障-文件系统对照
大数据·数据库·sql·oracle·database
ss2739 分钟前
AI时代首先数据库-PostgreSQL实战笔记 | 17 PostgreSQL SQL高级查询:窗口函数、CASE、COALESCE
数据库·笔记·postgresql
西红柿炖牛腩35412 分钟前
3D 模型压缩脚本又报错又配环境?换个不用维护的方案
javascript·3d·性能优化
远方160915 分钟前
119-Oracle CDB 下修改和重置 SYS SYSTEM密码记录
大数据·数据库·sql·oracle·database
橙光成长19 分钟前
Context Mode 深度解析:用沙盒、SQLite 与钩子路由,把 AI 编码 Agent 的上下文消耗削减 98%
数据库·人工智能·sqlite
打工仔折腾 AI20 分钟前
极空间部署Portainer实战:绕过Socket权限、解决9000端口冲突与固定内网访问
人工智能·后端·python·性能优化
数据库小学妹34 分钟前
MySQL时区问题排查:TIMESTAMP和DATETIME的区别与跨时区对账踩坑
数据库·mysql·datetime·时区·timestamp·跨时区对账
lexiangqicheng1 小时前
前端高阶面试核心通关指南:深入解析Vue3与React18底层原理及性能优化
前端·面试·性能优化
创世虚拟世界1 小时前
把 3D 虚拟世界拉到本地:vibe coding 的手感,是从看见自己那一行改动开始的
javascript·数据库·人工智能·3d·gitee·虚拟现实