【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:表示这些行几乎全部符合条件

相关推荐
白起那么早5 分钟前
idea 插件-把数据库的表画出来
数据库·后端·intellij idea
fengkai454524 分钟前
十一、MySQL 第 1‑3 章
运维·数据库·mysql
Lancker32 分钟前
记一次 Druid 连接 MySQL 报 Communications link failure 的排查过程
数据库·mysql·adb
Sayai36 分钟前
Neo4j 内嵌模式(Embedded)实战:Java 嵌入式 vs 服务端部署的写入性能对比与 GC 调优
java·开发语言·性能优化·neo4j·图数据库
自强的小白1 小时前
mybatis_plus的核心功能(条件构造器)
mysql
adinnet20261 小时前
多轮对话与上下文压缩:追问时模型怎么记住前面说的
数据库·microsoft
JosieBook1 小时前
【数据库】MySQL 实战精通系列 · 第11篇:Redis 缓存与 MySQL 一致性实战
数据库·mysql·缓存
Leo.yuan2 小时前
2026企业级数据集成平台市场报告:国内外厂商格局与技术路线
数据库·oracle
guo_wen_qiang2 小时前
云服务器mysql分库分表环境搭建(2库4表)
数据库·mysql·docker
jianpeng的工程笔记2 小时前
EL8 / EL9 安装 Slurm 26.05.4:主备控制器、MariaDB 记账与作业验收
linux·数据库·mariadb·高性能计算·slurm