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

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

前言索引是数据库性能优化的核心手段合理设计索引能大幅提升查询效率。本节从索引选型、复合索引规则、索引失效场景、三大高频概念四个维度讲解搭配可运行 SQL、实战案例与课后练习上手即用。一、基础测试表执行以下 SQL 创建测试表本节所有案例、练习均基于该表CREATETABLEuser(idINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(20),ageINT,phoneVARCHAR(11),cityVARCHAR(30),create_timeDATETIME);二、判断哪些字段适合/不适合建索引2.1 适合建立索引的字段WHERE后面常用的查询条件字段name、age、city多表关联JOIN的外键字段如user_id这类关联字段经常用于ORDER BY排序、GROUP BY分组的字段唯一性高的字段手机号、身份证号等重复数据极少的字段2.2 不建议建立索引的字段重复值极高的字段性别、状态等少量枚举类型字段频繁更新修改的字段索引会随数据更新同步维护加重数据库开销数据量小、业务中极少查询的字段三、复合索引 最左前缀原则3.1 创建复合索引-- 创建 (name, age) 复合索引CREATEINDEXidx_name_ageONuser(name,age);3.2 可以正常命中索引符合最左前缀-- 仅匹配复合索引最左侧首列正常走索引SELECT*FROMuserWHEREname张三;-- 依次匹配左侧所有字段正常走索引SELECT*FROMuserWHEREname张三ANDage25;3.3 无法命中索引违背最左前缀索引失效-- 跳过最左侧 name直接查询后续字段索引完全失效SELECT*FROMuserWHEREage25;3.4 拓展练习需求创建复合索引idx_city_time(city,create_time)分别写出可走索引、索引失效的 SQL 语句。参考答案-- 1. 创建指定复合索引CREATEINDEXidx_city_timeONuser(city,create_time);-- 可命中索引SELECT*FROMuserWHEREcity上海;SELECT*FROMuserWHEREcity上海ANDcreate_time2026-01-01;-- 索引失效跳过首列 citySELECT*FROMuserWHEREcreate_time2026-01-01;四、索引失效常见场景实操演示日常开发高频踩坑点以下写法都会导致索引失效触发全表扫描-- 1. 左侧模糊匹配 / 全模糊匹配索引失效SELECT*FROMuserWHEREnameLIKE%李;-- 2. 索引字段发生隐式类型转换索引失效-- phone 为字符串类型使用数字查询类型不匹配SELECT*FROMuserWHEREphone13800138000;-- 3. 索引列参与运算、函数计算索引失效SELECT*FROMuserWHEREage1030;-- 4. OR 连接的字段中存在无索引字段整体索引失效SELECT*FROMuserWHEREname李四ORcity北京;五、三大面试高频索引概念 实例讲解5.1 索引覆盖概念查询所需的所有字段全部存在于索引中数据库无需回表查询原始数据查询效率极高。-- 先创建复合索引CREATEINDEXidx_name_ageONuser(name,age);-- 查询字段 name、age 都在索引内触发索引覆盖无需回表SELECTname,ageFROMuserWHEREname张三;5.2 最左前缀原则概念使用复合索引时查询条件必须优先匹配索引最左侧字段不能跳跃、颠倒顺序否则索引失效。5.3 索引下推概念InnoDB 引擎特性在索引层先完成数据筛选再回表查询减少回表数据行数提升性能。-- 索引为 (name,age)-- 先在索引层过滤 name王五 且 age20 的数据再回表即索引下推SELECT*FROMuserWHEREname王五ANDage20;六、课后实操练习题基于上方user表完成以下练习为用户表合理创建单值索引、复合索引分别写出 3 条索引生效SQL、3 条索引失效SQL手写一条索引覆盖查询语句。参考答案-- 1. 创建索引-- 单值索引CREATEINDEXidx_phoneONuser(phone);-- 复合索引CREATEINDEXidx_city_nameONuser(city,name);-- 2. 索引生效 SQL3条SELECT*FROMuserWHEREphone13800138000;SELECT*FROMuserWHEREcity广州;SELECT*FROMuserWHEREcity广州ANDname赵六;-- 索引失效 SQL3条SELECT*FROMuserWHEREnameLIKE%王%;SELECT*FROMuserWHEREcity深圳;SELECT*FROMuserWHEREname钱七ORage30;-- 3. 索引覆盖查询语句-- 利用 idx_city_name 索引只查询索引内字段SELECTcity,nameFROMuserWHEREcity广州;
http://www.rkmt.cn/news/1409966.html

相关文章:

  • 别只改my.cnf了!深入解读MariaDB密码策略与general_log审计的取舍与最佳实践
  • GMS1.4 YYC编译的游戏,如何安全地修改游戏内文字?(附UndertaleModTool实战)
  • 【MATLAB源码-第450期】基于MATLAB的GMSK调制系统中IQ相干、差分、鉴频与Viterbi解调算法对比仿真
  • ROCK5B新手避坑指南:用BalenaEtcher给NVMe刷Debian11,从驱动安装到首次登录的完整流程
  • 2026支持百度AI优化的GEO服务商测评:服务优质响应高效
  • 2026年4月花灯供货商怎么选,景区灯会/大型户外花灯/天幕花灯/春节国潮花灯/春节花灯/巡游花灯,花灯定做厂家推荐分析 - 品牌推荐师
  • 手把手教你用Ascend-Docker-Runtime部署昇腾AI推理容器:从环境配置到避坑指南(CANN 5.0.1)
  • 论文同时踩查重和AI检测红线?双效处理工具实测推荐
  • ChatGPT餐厅推荐生成的5大致命误区:92%开发者忽略的上下文断裂、地域偏差与合规雷区
  • ChatGPT谜题求解失效真相(92%用户忽略的思维建模断层)
  • 别再死磕ImageNet预训练了:实战中工业缺陷检测模型的‘水土不服’与调优方案
  • 从一次失败的渗透说起:我是如何审计Maccms搜索功能并挖到命令执行漏洞的
  • 全网最稳!WSL/Ubuntu 环境下部署 Ollama 的踩坑实录与避坑指南
  • 【网安-Web渗透测试-免杀系列】PowerShell免杀
  • 告别65535行限制:用QGIS一键把大型SHP文件导出为Excel表格
  • 如何高效使用AutoDingding实现钉钉自动打卡:终极实用指南
  • k8s-Prometheus的manifests 清单部署
  • 别再死记硬背公式了!用LTspice仿真带你直观理解Buck、Boost、Buck-Boost三大基础拓扑
  • LAMMPS转Material Studio数据流打通:从Perl脚本到MS建模的完整避坑实践
  • 别再只调包了!用PyTorch从零实现DCGAN生成二次元头像(附完整代码与数据集)
  • Agent进化,腾讯云全栈融合矩阵构建国产数字化底座
  • 从表单验证到数据统计:手把手教你用some、every和reduce搞定前端常见业务场景
  • 平平无奇的源码,竟藏着Agent的核心秘密?
  • 网站渗透实操!从getshell到CVE提权,Linux最新内核也可提权!
  • 从Arduino到ESP32:搞定3.3V/5V混接通信,这几种电平转换电路你试过吗?
  • Python实战:用XGBoost+SHAP搞定多分类业务预测(附完整代码与避坑指南)
  • LAMMPS新手避坑指南:从应力云图到MSD分析,这8个计算命令别再写错了
  • 告别手动移植:用STM32CubeIDE一站式搞定STM32WL的LoRaWAN节点工程
  • 从普通到Low ESR:手把手教你读懂铝电解电容规格书里的‘损耗角’与ESR换算
  • 保姆级教程:用Grad-CAM可视化Swin Transformer,看看你的模型到底在“看”哪里