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

索引设计 实操SQL + 案例 + 练习

前言

索引是数据库性能优化的核心手段,合理设计索引能大幅提升查询效率。本节从索引选型、复合索引规则、索引失效场景、三大高频概念四个维度讲解,搭配可运行 SQL、实战案例与课后练习,上手即用。

一、基础测试表

执行以下 SQL 创建测试表,本节所有案例、练习均基于该表:

CREATETABLE`user`(idINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(20),ageINT,phoneVARCHAR(11),cityVARCHAR(30),create_timeDATETIME);

二、判断哪些字段适合/不适合建索引

2.1 适合建立索引的字段

  1. WHERE后面常用的查询条件字段:nameagecity
  2. 多表关联JOIN的外键字段:如user_id这类关联字段
  3. 经常用于ORDER BY排序、GROUP BY分组的字段
  4. 唯一性高的字段:手机号、身份证号等重复数据极少的字段

2.2 不建议建立索引的字段

  1. 重复值极高的字段:性别、状态等少量枚举类型字段
  2. 频繁更新修改的字段:索引会随数据更新同步维护,加重数据库开销
  3. 数据量小、业务中极少查询的字段

三、复合索引 & 最左前缀原则

3.1 创建复合索引

-- 创建 (name, age) 复合索引CREATEINDEXidx_name_ageONuser(name,age);

3.2 可以正常命中索引(符合最左前缀)

-- 仅匹配复合索引最左侧首列,正常走索引SELECT*FROMuserWHEREname='张三';-- 依次匹配左侧所有字段,正常走索引SELECT*FROMuserWHEREname='张三'ANDage=25;

3.3 无法命中索引(违背最左前缀,索引失效)

-- 跳过最左侧 name,直接查询后续字段,索引完全失效SELECT*FROMuserWHEREage=25;

3.4 拓展练习

需求:创建复合索引idx_city_time(city,create_time),分别写出可走索引索引失效的 SQL 语句。

参考答案
-- 1. 创建指定复合索引CREATEINDEXidx_city_timeONuser(city,create_time);-- 可命中索引SELECT*FROMuserWHEREcity='上海';SELECT*FROMuserWHEREcity='上海'ANDcreate_time>'2026-01-01';-- 索引失效(跳过首列 city)SELECT*FROMuserWHEREcreate_time>'2026-01-01';

四、索引失效常见场景(实操演示)

日常开发高频踩坑点,以下写法都会导致索引失效,触发全表扫描:

-- 1. 左侧模糊匹配 / 全模糊匹配,索引失效SELECT*FROMuserWHEREnameLIKE'%李';-- 2. 索引字段发生隐式类型转换,索引失效-- phone 为字符串类型,使用数字查询,类型不匹配SELECT*FROMuserWHEREphone=13800138000;-- 3. 索引列参与运算、函数计算,索引失效SELECT*FROMuserWHEREage+10=30;-- 4. OR 连接的字段中,存在无索引字段,整体索引失效SELECT*FROMuserWHEREname='李四'ORcity='北京';

五、三大面试高频索引概念 + 实例讲解

5.1 索引覆盖

概念:查询所需的所有字段,全部存在于索引中,数据库无需回表查询原始数据,查询效率极高。

-- 先创建复合索引CREATEINDEXidx_name_ageONuser(name,age);-- 查询字段 name、age 都在索引内,触发索引覆盖,无需回表SELECTname,ageFROMuserWHEREname='张三';

5.2 最左前缀原则

概念:使用复合索引时,查询条件必须优先匹配索引最左侧字段,不能跳跃、颠倒顺序,否则索引失效。

5.3 索引下推

概念:InnoDB 引擎特性,在索引层先完成数据筛选,再回表查询,减少回表数据行数,提升性能。

-- 索引为 (name,age)-- 先在索引层过滤 name='王五' 且 age>20 的数据,再回表,即索引下推SELECT*FROMuserWHEREname='王五'ANDage>20;

六、课后实操练习题

基于上方user表完成以下练习:

  1. 为用户表合理创建单值索引复合索引
  2. 分别写出 3 条索引生效SQL、3 条索引失效SQL;
  3. 手写一条索引覆盖查询语句。

参考答案

-- 1. 创建索引-- 单值索引CREATEINDEXidx_phoneONuser(phone);-- 复合索引CREATEINDEXidx_city_nameONuser(city,name);-- 2. 索引生效 SQL(3条)SELECT*FROMuserWHEREphone='13800138000';SELECT*FROMuserWHEREcity='广州';SELECT*FROMuserWHEREcity='广州'ANDname='赵六';-- 索引失效 SQL(3条)SELECT*FROMuserWHEREnameLIKE'%王%';SELECT*FROMuserWHEREcity+''='深圳';SELECT*FROMuserWHEREname='钱七'ORage=30;-- 3. 索引覆盖查询语句-- 利用 idx_city_name 索引,只查询索引内字段SELECTcity,nameFROMuserWHEREcity='广州';
http://www.jsqmd.com/news/900792/

相关文章:

  • k8s-Prometheus的manifests 清单部署
  • 别再乱试了!用Wireshark精准定位微信/QQ通话IP的保姆级教程(附过滤语法)
  • 研一开学别慌!用这套保姆级YOLOv5实战路线,从零到跑通代码只要三个月
  • 保姆级教程:用Grad-CAM可视化Swin Transformer,看看你的模型到底在“看”哪里
  • 手机变Linux开发机:用Termux和MT管理器打造移动端代码编辑与文件管理环境
  • .NET + 消息队列:稳稳扛住百亿流水,这才是企业级架构的真正底气
  • sd卡病毒格式化文件怎么恢复正常,只需4种方法和视频演示轻松恢复数据
  • 如何高效使用AutoDingding实现钉钉自动打卡:终极实用指南
  • S32K3xx低功耗实战:用LPUART串口唤醒Standby模式,保姆级配置流程(基于Platform SDK 2022.03)
  • 第 3 篇:把 MCP 接入 AI,以及生态里有什么
  • STM32F1用HAL库驱动42步进电机:CubeMX配置PWM定时器(TIM3)保姆级教程
  • 从野外数据到地下构造:手把手教你用地震时距曲线做一次‘虚拟勘探’
  • Cadence SPB17.4 CIS库添加新元件失败?手把手教你排查‘找不到元件’的5个常见坑
  • AI品牌命名避坑清单(含12个高危词根、6类语音陷阱、4种文化禁忌),错过本次更新将影响全球市场准入
  • AI 助手类应用通用安全漏洞:间接提示注入可窃取企业敏感数据
  • 告别65535行限制:用QGIS一键把大型SHP文件导出为Excel表格
  • RK3566开发板GT911触屏调试避坑指南:从I2C检测到DTS配置的完整流程
  • 2026年 宝钢镀锌HC550/980DPD+Z双相钢厂家/供应商推荐榜:高强度与卓越成型性能的行业优选品牌 - 品牌企业推荐师(官方)
  • C# 终于支持 union types 了
  • NestJS项目接口权限怎么管理?结合Swagger文档清晰展示JWT守卫与角色控制
  • 从普通到Low ESR:手把手教你读懂铝电解电容规格书里的‘损耗角’与ESR换算
  • 3分钟掌握:tchMaterial-parser电子课本下载工具完整使用指南
  • 数据仓库实战:当Hive表插错数据后,我是如何用‘重写’而不是‘删除’来救场的
  • 【网安-Web渗透测试-免杀系列】PowerShell免杀
  • 别再死记硬背公式了!用Python+Matplotlib手把手教你画滤波器的Bode图(附代码)
  • 用Python手把手复现FOIL算法:从家庭关系图谱到知识推理的完整实战
  • Cell-Free Massive MIMO硬件损伤分析与优化策略
  • 烤火罩在潮湿环境容易发霉吗 新 E 选品牌源头厂家说明
  • 【Xiaomi】Xiaomi 17 Max发布就讲透
  • 量子张量网络在BEC模拟中的高效应用