设计索引的原则有哪些?

MySQL 索引设计的核心原则是 在查询性能与存储成本之间取得平衡。以下是经过实践验证的 10 大设计原则及具体实现策略:


一、基础原则

原则说明示例/反例
1. 高频查询优先WHEREJOINORDER BYGROUP BY 频繁出现的列建索引SELECT * FROM orders WHERE user_id=100 → 为 user_id 建索引
2. 高区分度优先选择区分度高的列(唯一值比例 ≈1)✅ 身份证号 > 性别
❌ 在 gender(仅2种值)建索引效果差
3. 最左前缀匹配联合索引按查询顺序从左到右排列索引 (a,b,c) 生效场景:
WHERE a=1
WHERE a=1 AND b=2
WHERE b=2

二、字段选择原则

原则说明最佳实践
4. 短字段优先更小的索引 → 更高缓存命中率SMALLINT 代替 INT
CHAR(10) 代替 VARCHAR(100)
5. 整型优于字符型整型比较比字符串快,且节省空间IP 转 INT (INET_ATON()) 代替字符串存储 IP
6. 避免 NULL 列NULL 增加索引复杂度建表时设置 NOT NULL DEFAULT ''

三、索引类型选择

场景推荐索引类型优势
7. 精确匹配B+Tree 索引标准场景,支持 =, >, <, BETWEEN
8. 全文搜索FULLTEXT 索引TEXT 内容高效搜索 (MATCH AGAINST)
9. 空间数据SPATIAL 索引地理位置计算 (GIS)
10. 哈希去重唯一索引 (UNIQUE)强制业务唯一性(如用户名)

四、联合索引设计策略

1. 列顺序决策公式
优先级 = 查询频率 × 区分度
  • 正确示例
    orders 的查询模式:
    SELECT * FROM orders 
    WHERE status='paid'          -- 区分度低 (3种状态)AND create_time > '2023-01-01' -- 区分度高
    
    → 联合索引应设为 (create_time, status)
2. 覆盖索引优化
-- 未优化
SELECT name, email FROM users WHERE age>30; -- 优化方案:创建覆盖索引
ALTER TABLE users ADD INDEX idx_age_name_email (age, name, email);
  • ✅ 效果:索引覆盖所有查询字段,避免回表

五、避坑指南(常见错误)

错误做法问题改进方案
盲目创建索引写性能下降 30%~50%用慢查询日志定位真正需要的索引
无效索引WHERE status=1 (status=1 占比 95%)删除低区分度索引
冗余索引已有 (a,b) 又建 (a)删除单列索引 (a)
索引列参与运算WHERE YEAR(create_time)=2023改范围查询:WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31'

六、高级优化技巧

1. 索引下推 (ICP)
  • 启用条件:MySQL 5.6+,联合索引部分条件过滤
  • 效果
    -- 索引 (city, age)
    SELECT * FROM users 
    WHERE city='杭州' AND age>20;-- 5.6 前:先取所有 city='杭州' 数据 → 回表 → 过滤 age>20
    -- 5.6+:在索引层直接过滤 age>20 → 仅回表匹配行
    
2. 索引合并优化
-- 存在索引 (a) 和 (b)
SELECT * FROM table WHERE a=1 OR b=2;-- 优化器可能合并索引扫描 (Index Merge)

七、索引监控与维护

1. 分析索引使用率
-- 查看未使用索引
SELECT * FROM sys.schema_unused_indexes;-- 索引统计信息
SHOW INDEX FROM orders;
2. 碎片整理
-- InnoDB 索引重建
ALTER TABLE orders ENGINE=InnoDB; -- 优化索引页
OPTIMIZE TABLE orders;

八、设计流程图

在这里插入图片描述

九、总结:黄金准则

  1. 必要性原则:只为必要的查询建索引
  2. 左前缀原则:联合索引严格按查询顺序设计
  3. 覆盖索引优先:避免 SELECT * 回表开销
  4. 短小精悍:整型优于字符串,小字段优于大字段
  5. 持续监控:定期清理无效索引(写代价 > 读收益)

📊 数据佐证:根据阿里云数据库团队统计,合理索引设计可使查询性能提升 10~100 倍,降低 70% 的数据库负载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95788.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用影刀RPA实现快递信息抓取

最近公司项目有个需求&#xff0c;要求抓取快递单号快递信息&#xff0c;比如签收地点、签收日期等。该项目对应的快递查询网站是一个国外的网站&#xff0c;他们有专门的快递平台可以用于查询。该平台提供了快递接口进行查询&#xff0c;但需要付费。同时也提供了免费的查询窗…

蚁剑--安装、使用

用途限制声明&#xff0c;本文仅用于网络安全技术研究、教育与知识分享。文中涉及的渗透测试方法与工具&#xff0c;严禁用于未经授权的网络攻击、数据窃取或任何违法活动。任何因不当使用本文内容导致的法律后果&#xff0c;作者及发布平台不承担任何责任。渗透测试涉及复杂技…

Varjo XR虚拟现实军用车辆驾驶与操作培训

Patria基于混合现实的模拟器提供了根据现代车辆乘员需求定制的培训&#xff0c;与传统显示设置相比&#xff0c;全新的模拟解决方案具有更好的沉浸感和更小的物理空间需求。Patria是芬兰领先的国防、安全和航空解决方案提供商。提供尖端技术和全面的培训系统&#xff0c;以支持…

Java 10 新特性及具体应用

目录 1. 局部变量类型推断&#xff08;JEP 286&#xff09; 2. 不可修改集合&#xff08;JEP 269&#xff09; 3. 并行全垃圾回收&#xff08;JEP 307&#xff09; 4. 应用类数据共享&#xff08;JEP 310&#xff09; 5. 线程局部管控&#xff08;JEP 312&#xff09; 总结…

【力扣 Hot100】刷题日记

D8 全排列(非回溯法) 全排列原题链接 在刷leetcode的时候&#xff0c;看到这道题目并没法使用像STL的next_permutation方法&#xff0c;感叹C便利的同时&#xff0c;又惋惜Java并没有类似的API&#xff0c;那我们只能从原理入手了&#xff0c;仿写此算法。 其实回溯法更应该…

JetPack系列教程(七):Palette——让你的APP色彩“飞”起来!

JetPack系列教程&#xff08;七&#xff09;&#xff1a;Palette——让你的APP色彩“飞”起来&#xff01; 各位开发小伙伴们&#xff0c;还在为APP的配色发愁吗&#xff1f;别担心&#xff0c;今天咱们就来聊聊JetPack家族里的“色彩魔法师”——Palette&#xff01;这个神奇的…

力扣hot100 | 矩阵 | 73. 矩阵置零、54. 螺旋矩阵、48. 旋转图像、240. 搜索二维矩阵 II

73. 矩阵置零 力扣题目链接 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]…

ARC与eARC是什么?主要用在哪?

在家庭影音设备不断升级的今天&#xff0c;人们对音视频体验的要求越来越高。无论是追剧、玩游戏还是观看电影大片&#xff0c;很多用户不再满足于电视自带的扬声器&#xff0c;而是希望借助回音壁、功放或家庭影院系统&#xff0c;获得更加震撼的沉浸式声音体验。一、ARC是什么…

解锁JavaScript性能优化:从理论到实战

文章目录 前言 一、常见性能瓶颈剖析 二、实战案例与优化方案 (一)DOM 操作优化案例​ (二)事件绑定优化案例​ (三)循环与递归优化案例​ (四)内存管理优化案例​ 三、性能优化工具介绍 总结 前言 性能优化的重要性 在当今数字化时代,Web 应用已成为人们生活和工作…

结构化记忆、知识图谱与动态遗忘机制在医疗AI中的应用探析(上)

往期相关内容推荐: 基于Python的多元医疗知识图谱构建与应用研究(上)

XSS攻击:从原理入门到实战精通详解

一、XSS攻击基础概念1.1 什么是XSS攻击 XSS&#xff08;Cross-Site Scripting&#xff0c;跨站脚本攻击&#xff09;是一种将恶意脚本注入到可信网站中的攻击手段。当用户访问被注入恶意代码的页面时&#xff0c;浏览器会执行这些代码&#xff0c;导致&#xff1a;用户会话被劫…

Leetcode 14 java

今天复习一下以前做过的题目&#xff0c;感觉是忘光了。 160. 相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数…

用 FreeMarker 动态构造 SQL 实现数据透视分析

在 ERP、BI 等系统中&#xff0c;数据透视分析&#xff08;Pivot Analysis&#xff09;是非常常见的需求&#xff1a;用户希望按任意维度&#xff08;如门店、时间、商品分类等&#xff09;进行分组统计&#xff0c;同时选择不同的指标&#xff08;如 GMV、订单数、客单价等&am…

13.深度学习——Minst手写数字识别

第一部分——起手式 import torch from torchvision import datasets, transforms import torch.nn as nn import torch.nn.functional as F import torch.optim as optimuse_cuda torch.cuda.is_available()if use_cuda:device torch.device("cuda") else: device…

【JAVA高级】实现word转pdf 实现,源码概述。深坑总结

之前的需求做好后,需求,客户突发奇想。要将生成的word转为pdf! 因为不想让下载文档的人改动文档。 【JAVA】实现word添加标签实现系统自动填入字段-CSDN博客 事实上这个需求难度较高,并不是直接转换就行的 word文档当中的很多东西都需要处理 public static byte[] gener…

数据驱动测试提升自动化效率

测试工程师老王盯着满屏重复代码叹气&#xff1a;“改个搜索条件要重写20个脚本&#xff0c;这班加到啥时候是个头&#xff1f;” 隔壁组的小李探过头&#xff1a;“试试数据驱动呗&#xff0c;一套脚本吃遍所有数据&#xff0c;我们组上周测了300个组合都没加班&#xff01;”…

模板引用(Template Refs)全解析2

三、v-for 中的模板引用 当在 v-for 中使用模板引用时,引用的 value 会自动变为一个数组,包含列表中所有元素/组件的引用(需 Vue 3.5+ 版本,旧版需手动处理且顺序不保证)。 1. 基本用法(Vue 3.5+) <script setup> import { ref, useTemplateRef, onMounted } f…

【Linux系统】进程间通信:System V IPC——共享内存

前文中我们介绍了管道——匿名管道和命名管道来实现进程间通信&#xff0c;在介绍怎么进行通信时&#xff0c;我们有提到过不止管道的方式进行通信&#xff0c;还有System V IPC&#xff0c;今天这篇文章我们就来学习一下System V IPC中的共享内存1. 为何引入共享内存&#xff…

[优选算法专题二滑动窗口——最大连续1的个数 III]

题目链接 最大连续1的个数 III 题目描述 题目解析 问题本质 输入&#xff1a;二进制数组nums&#xff08;只包含 0 和 1&#xff09;和整数k操作&#xff1a;最多可以将k个 0 翻转成 1目标&#xff1a;找到翻转后能得到的最长连续 1 的子数组长度 这个问题的核心是要找到一…

C#单元测试(xUnit + Moq + coverlet.collector)

C#单元测试 xUnit Moq coverlet.collector 1.添加库 MlyMathLib 2.编写库函数内容 using System;namespace MlyMathLib {public interface IUserRepo{string GetName(int id);}public class UserService{private readonly IUserRepo _repo;public UserService(IUserRepo repo…