进阶-索引5-设计原则

一、MySQL进阶

1. 索引

索引设计不是简单地给每个字段加个索引,而是一场在查询性能写入速度存储空间维护成本之间的精细权衡。

1.1 设计原则

1. 索引不是越多越好,而是越精准越好

核心理念

索引虽好,但有代价:

  • 写入性能下降:每次INSERT/UPDATE/DELETE都需要同步更新所有相关索引
  • 存储空间膨胀:每个索引都是一棵B+树,占用额外磁盘空间
  • 优化器负担加重:索引越多,MySQL查询优化器选择执行计划的时间越长

数据说话:一张1亿行的用户表,若建立10个二级索引,写入速度可能下降30%~50%,存储空间翻倍。

sql 复制代码
-- 错误示范:为低频查询字段建立索引
CREATE TABLE orders (
    id BIGINT PRIMARY KEY,
    user_id BIGINT,
    created_at DATETIME,
    internal_remark TEXT  -- 业务字段,但只在后台统计时偶尔查询
);
CREATE INDEX idx_internal_remark ON orders(internal_remark);  -- ❌ 低频查询,浪费索引

-- 正确做法:针对高频查询字段建立索引
CREATE INDEX idx_user_created ON orders(user_id, created_at);  -- ✅ 高频查询条件
2. 表级别:何时建立索引?

核心原则

索引的收益与表的数据量和查询频率成正比

  • 数据量越大,索引的价值越明显
  • 查询越频繁,索引的回报越高

选择标准

表类型 数据量 查询频率 是否建索引 说明
配置表 <100行 高频 ❌ 不建 全表扫描成本低
字典表 500行 高频 ✅ 建索引 每秒查询100次值得建
订单表 1000万行 高频 ✅ 建索引 索引价值高
订单表 1000万行 低频 ❌ 不建 维护成本高

经验值 :一般表数据量超过1000行,才考虑建立索引。但需结合查询频率,如500行表每秒查询100次,也值得建索引。

经验值 :一般表数据量超过1000行,才考虑建立索引。但需结合查询频率,如500行表每秒查询100次,也值得建索引。

3. 字段级别:哪些字段适合建索引?

三大应用场景

索引主要适用于以下三大场景:

  1. 过滤(WHERE条件) :如WHERE user_id = 123
  2. 排序(ORDER BY) :如ORDER BY create_time DESC
  3. 分组(GROUP BY) :如GROUP BY category_id

高选择性字段优先

选择性 = COUNT(DISTINCT column_name) / COUNT(*)

字段 选择性 是否适合建索引 说明
user_id 0.98 高选择性,几乎唯一
gender 0.02 低选择性,只有两个值
status 0.35 选择性>0.32,适合建索引
city 0.15 选择性<0.2,效果不佳

最佳实践:优先为高选择性的列创建索引,或将其作为联合索引的首列。

相关推荐
一隅论数智12 小时前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
小羊没烦恼!12 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
小白男神13 小时前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
伞伞悦读13 小时前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
这个DBA有点耶13 小时前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G13 小时前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备14 小时前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
C语言小火车14 小时前
C/C++ 为什么需要编译器?
开发语言·c++
科创致远14 小时前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
深圳老胡14 小时前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范