MySQL索引,这回真讲明白了
数据库慢查询是每个后端都会遇到的问题而90%的慢查询问题都可以通过合理设计索引来解决。这篇文章不聊深奥的底层原理从实际使用的角度讲清楚索引。索引到底是什么你可以把索引理解为一本书的目录。没有索引你要从头翻到尾找内容有了索引直接查目录跳到对应页码。MySQL的InnoDB引擎用的是B树索引。叶子节点存储数据非叶子节点只存索引值和指针。B树的好处是树的高度低3层能存几千万条数据范围查询效率高叶子节点有双向指针链。sql-- 没有索引时这条SQL会全表扫描 SELECT * FROM users WHERE email zhangsanexample.com; -- 创建索引后直接走B树查找速度提升几十倍 CREATE INDEX idx_email ON users(email);主键索引与二级索引InnoDB中数据是按照主键组织的所以主键索引的叶子节点直接存储完整的数据行这叫聚簇索引。而普通索引二级索引的叶子节点存储的是主键的值。通过二级索引查数据需要先找到主键再回主键索引取完整数据这个过程叫回表。sql-- 假设users表有主键id还有二级索引idx_name CREATE INDEX idx_name ON users(name); -- 这条SQL只需要查name和id索引里就有不用回表 SELECT id, name FROM users WHERE name 张三; -- 这条SQL要查email索引里没有需要回表取完整数据 SELECT id, name, email FROM users WHERE name 张三;最左前缀原则这是使用联合索引时最重要的原则也是面试高频考点。sql-- 创建联合索引 (name, age, city) CREATE INDEX idx_name_age_city ON users(name, age, city); -- ✅ 能用到索引 SELECT * FROM users WHERE name 张三; SELECT * FROM users WHERE name 张三 AND age 25; SELECT * FROM users WHERE name 张三 AND age 25 AND city 北京; -- ✅ 注意where条件的顺序不影响优化器会自动调整 SELECT * FROM users WHERE age 25 AND name 张三; -- 也能用到 -- ❌ 用不到索引跳过了name SELECT * FROM users WHERE age 25; SELECT * FROM users WHERE city 北京; SELECT * FROM users WHERE age 25 AND city 北京;联合索引从左往右匹配跳过了前面的字段就用不了索引。所以建联合索引时区分度高的字段放左边。sql-- 假设name区分度比age高这样建更合理 CREATE INDEX idx_name_age ON users(name, age); -- 而不是 idx_age_name覆盖索引与回表前面提到了回表。如果查询的字段都在索引里就不用回表了这叫覆盖索引性能会好很多。sql-- 索引是 (name, age) -- ✅ 覆盖索引查询字段都在索引中 SELECT name, age FROM users WHERE name 张三; -- ❌ 需要回表查询了不在索引中的字段 SELECT * FROM users WHERE name 张三;所以写SQL的时候尽量只查需要的字段少用SELECT *既减少网络传输也可能利用覆盖索引避免回表。索引失效的常见场景实际开发中建了索引但SQL没用上是经常发生的事情。以下场景索引会失效1. 在索引列上用函数sql-- ❌ 索引失效 SELECT * FROM orders WHERE DATE(create_time) 2024-01-01; -- ✅ 改成范围查询 SELECT * FROM orders WHERE create_time 2024-01-01 AND create_time 2024-01-02;2. 隐式类型转换sql-- 假设phone是varchar类型 -- ❌ 索引失效传了数字发生类型转换 SELECT * FROM users WHERE phone 13800138000; -- ✅ 传字符串 SELECT * FROM users WHERE phone 13800138000;3. LIKE以%开头sql-- ❌ 索引失效 SELECT * FROM users WHERE name LIKE %三; -- ✅ 可以用到索引 SELECT * FROM users WHERE name LIKE 张%;4. OR条件中有非索引列sql-- 假设name有索引age没有索引 -- ❌ 索引失效OR两边都要能用索引才行 SELECT * FROM users WHERE name 张三 OR age 25; -- ✅ 把age也建上索引或者用UNION SELECT * FROM users WHERE name 张三 UNION SELECT * FROM users WHERE age 25;5. 索引列参与计算sql-- ❌ 索引失效 SELECT * FROM products WHERE price * 0.8 100; -- ✅ 把计算移到右边 SELECT * FROM products WHERE price 100 / 0.8;6. 使用不等于! 或 或 IS NULLsql-- 不等于和IS NULL通常不走索引 SELECT * FROM users WHERE status ! 1;用EXPLAIN分析SQL遇到慢查询第一件事就是用EXPLAIN看执行计划。sqlEXPLAIN SELECT * FROM users WHERE name 张三;输出结果重点看这几列列名含义关注点type访问类型至少要到range或refALL就是全表扫描possible_keys可能用的索引看有没有预期中的索引key实际用的索引如果是NULL说明索引没用到rows扫描的行数这个值越大性能越差Extra额外信息出现Using filesort或Using temporary要警惕type的优劣排序从好到差systemconsteq_refrefrangeindexALL目标至少达到range级别。实战建索引的建议1. 不要建太多索引每个索引都占用磁盘空间且拖慢INSERT、UPDATE、DELETE的速度。一个表一般建议不超过5个索引。2. 区分度不高的字段不建索引比如性别男/女走索引还不如全表扫描快。sql-- 区分度 COUNT(DISTINCT column) / COUNT(*) -- 区分度低于10%的字段建索引效果不好 SELECT COUNT(DISTINCT gender) / COUNT(*) FROM users; -- 约 0.5%3. 长字符串用前缀索引sql-- 只对前20个字符建索引节省空间 CREATE INDEX idx_content ON articles(content(20));4. 频繁查询的字段优先建索引WHERE条件中频繁出现的字段ORDER BY排序的字段GROUP BY分组的字段JOIN连接的条件字段5. 不要用UUID作为主键UUID是随机字符串插入时会导致B树频繁分裂性能很差。建议用自增ID或者有序的雪花ID。总结索引的核心理念就一句话用空间换时间让查询少扫描数据。用好索引的要点搞懂最左前缀原则合理设计联合索引避免索引失效的写法函数、类型转换、前置%用EXPLAIN验证执行计划覆盖索引优于回表索引不是越多越好要精准索引是数据库性能优化的第一板斧掌握好它能解决绝大部分慢查询问题。

相关新闻

URA2415LD-15WR3 适配优选 VB15-24D15LD,15W 工业 DC-DC 模块电源参数规格全拆解

URA2415LD-15WR3 适配优选 VB15-24D15LD,15W 工业 DC-DC 模块电源参数规格全拆解

在工业电子整机研发阶段,硬件工程师针对模拟采集、信号变送、伺服控制等电路开展电源方案设计时,15W 等级 24V 输入双路 15V 输出 DC-DC 隔离电源属于高频选用器件。在多品牌、多系列直流电源模块横向筛选过程中,钡特电源 VB15-24D15LD 与 UR…

2026/7/23 14:42:44 阅读更多 →
直播间商品自动上下架系统的通用设计方案

直播间商品自动上下架系统的通用设计方案

背景在长时段AI数字人直播中,商品需要按预设顺序轮换讲解,讲过的不应重复出现,未讲的应按计划上架。人工盯屏手动切换费时费力,设计一套商品自动上下架系统可以大幅降低运营成本。系统架构核心组件包括:商品队列管理器…

2026/7/23 18:11:49 阅读更多 →
保姆级实战!用宝塔部署企业级Java开源电商商城

保姆级实战!用宝塔部署企业级Java开源电商商城

一、教程简介Tigshop是拥有16年企业级电商研发经验的开源商城系统,采用SpringBoot3 Vue3 Nuxt3 UniApp主流全栈架构,全面覆盖B2C单商户、B2B2C 多商户、O2O 多门店、跨境多语言、S2B2C 供应链五大核心电商场景,是企业级商用落地首选的开源…

2026/7/23 23:25:49 阅读更多 →

最新新闻

高速差分信号接口设计:从LVDS/CML选型到SerDes架构与信号完整性实战

高速差分信号接口设计:从LVDS/CML选型到SerDes架构与信号完整性实战

1. 项目概述:高速差分信号接口的基石 在当今的数据洪流时代,无论是数据中心服务器间每秒TB级的交互,还是智能手机屏幕上流畅的4K视频显示,背后都离不开一项关键技术:高速差分信号接口。你可能听说过LVDS、CML这些名词&…

2026/7/24 10:03:22 阅读更多 →
YOLOv1目标检测算法原理与实现详解

YOLOv1目标检测算法原理与实现详解

1. YOLOv1 设计思想与核心突破 YOLOv1(You Only Look Once)是2016年由Joseph Redmon等人提出的革命性目标检测框架。与当时主流的R-CNN系列方法不同,YOLO将目标检测重新定义为单一的回归问题,这种端到端的处理方式带来了显著的效率…

2026/7/24 10:03:22 阅读更多 →
Windows平台本地部署Llama3-8B大模型实战指南

Windows平台本地部署Llama3-8B大模型实战指南

1. 项目概述:Windows平台运行Llama3的可行性分析在个人PC上运行百亿参数级别的AI大模型,这在两年前还是天方夜谭。但随着Llama3的发布和硬件加速技术的进步,现在用消费级Windows电脑就能体验最前沿的大模型能力。我最近在配备RTX 3060显卡的W…

2026/7/24 10:03:22 阅读更多 →
FPD-Link III BCC I2C远程控制:原理、配置与实战优化

FPD-Link III BCC I2C远程控制:原理、配置与实战优化

1. 项目概述:当I2C需要“长途跋涉”时 在嵌入式系统开发,尤其是汽车电子、工业视觉和安防监控领域,我们经常需要用一个主控制器去配置和管理分布在系统各个角落的传感器或外设。I2C总线因其简洁的两线制(SCL时钟线和SDA数据线&…

2026/7/24 10:03:22 阅读更多 →
Unity解谜游戏开发:物理交互与环境叙事技术实战解析

Unity解谜游戏开发:物理交互与环境叙事技术实战解析

最近在游戏开发圈里,一个现象级的独立游戏续作《DOOR II ~ドア 2~ TOKYO DIARY》引起了广泛关注。作为前作的忠实玩家,我第一时间体验了这款游戏,发现它不仅延续了独特的解谜玩法,更在叙事深度和技术实现上有了质的飞跃。但真正让…

2026/7/24 10:03:22 阅读更多 →
OpenClaw提示词增强:从Claude Code提取思维模板实战

OpenClaw提示词增强:从Claude Code提取思维模板实战

1. 项目概述:OpenClaw提示词增强实战这个项目本质上是在探索如何通过逆向工程思维,从Claude Code的源码中提取出高质量的思维模板,再将其整合到OpenClaw提示词系统中。我最近在实际工作中发现,很多开发者在使用大语言模型时&#…

2026/7/24 10:02:21 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻