数据库:如何设计最佳索引 / 数据库最佳索引设计指南
📅 2026/7/11 13:35:20
👁️ 次浏览
索引是数据库性能优化的核心武器但“乱建索引”比“不建索引”更可怕——它会拖慢写入速度、占用额外存储空间却对查询毫无帮助。下面我从索引设计原则、实战场景、避坑指南三个维度系统梳理最佳索引设计方法。一、索引设计五大核心原则原则说明示例1. 最左前缀匹配联合索引按定义顺序生效查询条件必须从索引最左列开始索引(a,b,c)能匹配WHERE a1、WHERE a1 AND b2但不能匹配WHERE b22. 高选择性优先优先为区分度高的字段建索引区分度 不同值数量 / 总行数性别2种区分度低 ×手机号几乎全不同区分度高 √3. 覆盖索引索引包含查询所需的所有字段避免回表SELECT id, name FROM users WHERE id1→ 索引(id, name)可直接返回无需回表4. 索引下推利用索引过滤更多数据减少回表次数MySQL 5.6联合索引(age, city)WHERE age18 AND city北京可在索引层过滤5. 区分高频查询优先为高频查询条件建索引低频查询可以不走索引主查询走索引报表类低频查询可走全表扫描二、实战索引设计方案2.1 单列索引 vs 联合索引场景推荐索引原因查询条件单一单列索引简单、轻量查询条件固定多个联合索引索引覆盖所有条件减少回表查询条件变化组合维护 2-3 个联合索引覆盖高频组合避免过多索引联合索引顺序设计口诀等值条件放前面范围条件放后面查询类型索引列顺序原因WHERE a1 AND b2(a, b)或(b, a)等值查询顺序不重要WHERE a1 AND b10(a, b)a 等值过滤后b 范围查询仍能利用索引WHERE a1 AND b2(b, a)b 等值过滤后a 范围查询仍能利用索引2.2 覆盖索引设计查询语句推荐索引为什么SELECT id, name FROM users WHERE age25(age, name)索引包含age和name无需回表SELECT id, name, age FROM users WHERE age25(age, name, age)索引覆盖所有字段完全覆盖2.3 前缀索引对于长文本字段如VARCHAR(255)可以只索引前 N 个字符sqlCREATE INDEX idx_email_prefix ON users (email(10));场景推荐原因文本字段前缀索引节省空间提升索引效率区分度足够前缀长度 10-15 字符需验证区分度是否够高2.4 索引设计速查表查询场景推荐索引注意事项WHERE id ?主键索引自动不需要额外建索引WHERE name ?(name)高选择性字段优先WHERE status 1 AND created_at 2024-01-01(status, created_at)等值在前范围在后WHERE city 北京 AND age BETWEEN 18 AND 30(city, age)高选择性优先ORDER BY created_at DESC(created_at)单列索引即可GROUP BY category_id(category_id)分组字段建索引JOIN ON users.id orders.user_id两张表关联字段都建索引外键索引LIKE 张%普通索引可用前缀匹配可用索引LIKE %张❌ 无法使用索引改为全文索引LIKE %张%❌ 无法使用索引改为全文索引或Elasticsearch三、索引失效场景与避坑指南场景原因解决方案WHERE name 张三 OR status 1OR 两侧都走索引才能生效改为UNION或分别在两侧建索引WHERE YEAR(created_at) 2024对索引列做函数运算改为created_at BETWEEN 2024-01-01 AND 2024-12-31WHERE name LIKE %张通配符在开头改为WHERE name LIKE 张%前缀匹配WHERE id 1 100对索引列做计算改为WHERE id 99WHERE name IS NOT NULL索引列参与 NULL 判断❌ 不会使用索引需重写查询索引列类型不匹配WHERE phone 123phone 是字符串改为WHERE phone 123联合索引未遵循最左前缀索引(a,b,c)查询WHERE b2补充索引(b)或调整索引顺序四、索引优化实战从慢查询到快查询案例一张订单表1000 万行数据sqlCREATE TABLE orders ( id BIGINT PRIMARY KEY, user_id INT, status TINYINT, amount DECIMAL(10,2), created_at DATETIME, updated_at DATETIME );1️⃣ 慢查询sqlSELECT * FROM orders WHERE user_id 10086 AND status 1 AND created_at 2024-06-01 ORDER BY created_at DESC LIMIT 10;分析EXPLAIN显示全表扫描typeALL扫描 1000 万行耗时 3.2 秒2️⃣ 设计索引sqlCREATE INDEX idx_user_status_created ON orders (user_id, status, created_at DESC);3️⃣ 优化后效果指标优化前优化后提升扫描行数10,000,00050 行减少 99.999%查询耗时3.2 秒0.01 秒320 倍五、索引监控与维护操作命令作用查看索引使用情况SHOW INDEX FROM table_name;查看当前所有索引分析查询计划EXPLAIN SELECT ...;确认是否使用了正确的索引查看索引使用频率SELECT * FROM sys.schema_index_statistics;找出未使用的冗余索引重建索引ALTER TABLE table_name ENGINEInnoDB;整理索引碎片删除无用索引DROP INDEX idx_name ON table_name;释放存储空间提升写入性能六、总结索引设计核心要点原则一句话总结最左前缀联合索引查询条件必须从第一列开始高选择性优先给区分度高的字段建索引覆盖索引索引包含查询所需的所有字段等值在前联合索引中等值条件放前面范围条件放后面避免函数运算不要在索引列上做函数运算前缀匹配LIKE 张%可用索引LIKE %张不可定期维护删除无用索引重建碎片索引控制在5个以内一张表索引数量建议控制在 5 个以内过多会影响写入性能
TypeScriptCompiler严格空检查:类型安全的内存访问与空值处理实现 【免费下载链接】TypeScriptCompiler TypeScript Compiler (by LLVM) 项目地址: https://gitcode.com/gh_mirrors/ty/TypeScriptCompiler
TypeScriptCompiler是基于LLVM构建的TypeScript编译…
📅 2026/7/11 13:34:19
3分钟掌握多引擎图片批量下载神器:Image-Downloader完全指南 【免费下载链接】Image-Downloader Download images from Google, Bing, Baidu. 谷歌、百度、必应图片下载. 项目地址: https://gitcode.com/gh_mirrors/im/Image-Downloader
在数字内容创作和数据…
📅 2026/7/11 13:34:19
3天掌握图像标注:LabelImg免费工具终极指南 【免费下载链接】labelImg LabelImg is now part of the Label Studio community. The popular image annotation tool created by Tzutalin is no longer actively being developed, but you can check out Label Studio…
📅 2026/7/11 13:34:19
AltStore完全指南:无需越狱实现iOS侧载的终极解决方案 【免费下载链接】AltStore AltStore is an alternative app store for non-jailbroken iOS devices. 项目地址: https://gitcode.com/gh_mirrors/al/AltStore
还在为iOS设备无法自由安装应用而烦恼吗&am…
📅 2026/7/11 14:30:53
文章目录 核心心智模型:CMake 是一个两步过程 一、配置阶段:`cmake -B ...` 1.1 `cmake <源码路径>` (最基础的配置) 1.2 `-B <构建目录>` (指定构建目录,推荐) 1.3 `-S <源码目录>` (显式指定源码目录) 1.4 `-G <生成器名称>` (指定生成器,至关重…
📅 2026/7/11 14:30:53
Gurubase社区参与指南:如何有效提交issue和参与讨论 【免费下载链接】gurubase Gurubase is an open-source RAG system that lets you create AI-powered Q&A assistants by indexing websites, PDF documents, YouTube videos, and GitHub code repositories.…
📅 2026/7/11 14:30:53
AhabAssistant实战指南:PC端《边狱公司》自动化助手深度解析 【免费下载链接】AhabAssistantLimbusCompany AALC,PC端Limbus Company小助手。AALC,Limbus Company Assistant on PC 项目地址: https://gitcode.com/gh_mirrors/ah/AhabAssist…
📅 2026/7/11 14:30:53
从零开始:使用gpt-oss-20b-WFP8-AFP8-KVFP8构建AI应用的10个技巧 【免费下载链接】gpt-oss-20b-WFP8-AFP8-KVFP8 项目地址: https://ai.gitcode.com/hf_mirrors/amd/gpt-oss-20b-WFP8-AFP8-KVFP8
想要构建高性能的AI应用吗?gpt-oss-20b-WFP8-AFP…
📅 2026/7/11 14:30:53
Firestorm用户指南:10个技巧提升论坛管理效率 【免费下载链接】firestorm An open-source forum engine, with an ElixirPhoenix backend and an Elm frontend. 项目地址: https://gitcode.com/gh_mirrors/fi/firestorm
Firestorm是一个基于ElixirPhoenix后端…
📅 2026/7/11 14:29:53
摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计…
📅 2026/7/11 0:00:31
1. 命令简介gpm 是 Linux 系统下运行于虚拟控制台(文字终端模式)的鼠标服务器。它的主要功能是在没有图形界面的纯文本环境中,为虚拟控制台提供鼠标支持,允许用户使用鼠标进行文本的选择、复制和粘贴操作,极大地提升了…
📅 2026/7/11 0:00:31
导语
先澄清一个常被混用的概念:BI试点"上线",并不等于试点"验收通过"。很多企业把仪表板做出来、账号发下去、培训开完场,就默认试点已经跑通,随后进入推广阶段——结果推广到第二个部门、第三个业务线时&am…
📅 2026/7/11 0:00:31
1. 项目背景与核心需求 在嵌入式系统开发中,快速精确的数据检索是一个常见但极具挑战性的需求。特别是在工业控制、医疗设备和物联网终端等场景下,系统往往需要在毫秒级时间内完成关键参数的读取和写入操作。传统基于Flash存储的方案存在擦写次数有限、操…
📅 2026/7/10 22:46:54
1. 工业电流环信号传输的基础认知在工业自动化领域,4-20mA电流环传输技术已经持续服役超过半个世纪。这种看似简单的信号传输方式之所以能经久不衰,核心在于其独特的抗干扰能力——电流信号在长距离传输时几乎不受线路电阻和电压波动的影响。我曾在化工厂…
📅 2026/7/10 22:46:54
最近在项目里尝试用 YOLO 做目标检测,从环境搭建到模型训练,再到推理部署,整个过程踩了不少坑。网上的资料虽然多,但要么版本老旧,要么步骤零散不成体系,对于刚入门的新手来说,很容易卡在某个环…
📅 2026/7/10 22:46:54
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/10 22:46:54
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/10 22:46:54
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/10 22:46:54