从 0 学习 MySQL 索引------7 大核心精讲
为什么加了索引还是慢?90% 的索引失效场景都在这。
一、什么是 MySQL 索引
1.1 一句话定义
索引 = 数据库的"目录",帮你从 100w 行里快速找到 1 行,不用全表扫描。
类比:书的目录帮你快速找到某一章,不用翻整本书。
1.2 为什么需要索引
#mermaid-svg-hIR2BOXmVgGxqzSX{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-hIR2BOXmVgGxqzSX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-hIR2BOXmVgGxqzSX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-hIR2BOXmVgGxqzSX .error-icon{fill:#552222;}#mermaid-svg-hIR2BOXmVgGxqzSX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hIR2BOXmVgGxqzSX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-hIR2BOXmVgGxqzSX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hIR2BOXmVgGxqzSX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hIR2BOXmVgGxqzSX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-hIR2BOXmVgGxqzSX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hIR2BOXmVgGxqzSX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hIR2BOXmVgGxqzSX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hIR2BOXmVgGxqzSX .marker.cross{stroke:#333333;}#mermaid-svg-hIR2BOXmVgGxqzSX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hIR2BOXmVgGxqzSX p{margin:0;}#mermaid-svg-hIR2BOXmVgGxqzSX .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-hIR2BOXmVgGxqzSX .cluster-label text{fill:#333;}#mermaid-svg-hIR2BOXmVgGxqzSX .cluster-label span{color:#333;}#mermaid-svg-hIR2BOXmVgGxqzSX .cluster-label span p{background-color:transparent;}#mermaid-svg-hIR2BOXmVgGxqzSX .label text,#mermaid-svg-hIR2BOXmVgGxqzSX span{fill:#333;color:#333;}#mermaid-svg-hIR2BOXmVgGxqzSX .node rect,#mermaid-svg-hIR2BOXmVgGxqzSX .node circle,#mermaid-svg-hIR2BOXmVgGxqzSX .node ellipse,#mermaid-svg-hIR2BOXmVgGxqzSX .node polygon,#mermaid-svg-hIR2BOXmVgGxqzSX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hIR2BOXmVgGxqzSX .rough-node .label text,#mermaid-svg-hIR2BOXmVgGxqzSX .node .label text,#mermaid-svg-hIR2BOXmVgGxqzSX .image-shape .label,#mermaid-svg-hIR2BOXmVgGxqzSX .icon-shape .label{text-anchor:middle;}#mermaid-svg-hIR2BOXmVgGxqzSX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-hIR2BOXmVgGxqzSX .rough-node .label,#mermaid-svg-hIR2BOXmVgGxqzSX .node .label,#mermaid-svg-hIR2BOXmVgGxqzSX .image-shape .label,#mermaid-svg-hIR2BOXmVgGxqzSX .icon-shape .label{text-align:center;}#mermaid-svg-hIR2BOXmVgGxqzSX .node.clickable{cursor:pointer;}#mermaid-svg-hIR2BOXmVgGxqzSX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-hIR2BOXmVgGxqzSX .arrowheadPath{fill:#333333;}#mermaid-svg-hIR2BOXmVgGxqzSX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hIR2BOXmVgGxqzSX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hIR2BOXmVgGxqzSX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hIR2BOXmVgGxqzSX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-hIR2BOXmVgGxqzSX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hIR2BOXmVgGxqzSX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-hIR2BOXmVgGxqzSX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hIR2BOXmVgGxqzSX .cluster text{fill:#333;}#mermaid-svg-hIR2BOXmVgGxqzSX .cluster span{color:#333;}#mermaid-svg-hIR2BOXmVgGxqzSX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hIR2BOXmVgGxqzSX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-hIR2BOXmVgGxqzSX rect.text{fill:none;stroke-width:0;}#mermaid-svg-hIR2BOXmVgGxqzSX .icon-shape,#mermaid-svg-hIR2BOXmVgGxqzSX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hIR2BOXmVgGxqzSX .icon-shape p,#mermaid-svg-hIR2BOXmVgGxqzSX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-hIR2BOXmVgGxqzSX .icon-shape .label rect,#mermaid-svg-hIR2BOXmVgGxqzSX .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hIR2BOXmVgGxqzSX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-hIR2BOXmVgGxqzSX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-hIR2BOXmVgGxqzSX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-hIR2BOXmVgGxqzSX .bad>*{fill:#FF5252!important;stroke:#C62828!important;color:#fff!important;}#mermaid-svg-hIR2BOXmVgGxqzSX .bad span{fill:#FF5252!important;stroke:#C62828!important;color:#fff!important;}#mermaid-svg-hIR2BOXmVgGxqzSX .bad tspan{fill:#fff!important;}#mermaid-svg-hIR2BOXmVgGxqzSX .good>*{fill:#66BB6A!important;stroke:#2E7D32!important;color:#fff!important;}#mermaid-svg-hIR2BOXmVgGxqzSX .good span{fill:#66BB6A!important;stroke:#2E7D32!important;color:#fff!important;}#mermaid-svg-hIR2BOXmVgGxqzSX .good tspan{fill:#fff!important;} 没有索引
100w 行全表扫描
5 秒返回
有索引
B+Tree 二分查找
几毫秒返回
1.3 B+Tree 原理
| 概念 | 解释 |
|---|---|
| 二叉树 | 每个节点 2 个子节点,深度 = log2(N) |
| B-Tree | 多路平衡查找树,每个节点多个 key |
| B+Tree | 数据全在叶子节点,叶子节点形成链表 ⭐ MySQL 用这个 |
#mermaid-svg-oLCFdr6Fy27s6T0T{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-oLCFdr6Fy27s6T0T .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-oLCFdr6Fy27s6T0T .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-oLCFdr6Fy27s6T0T .error-icon{fill:#552222;}#mermaid-svg-oLCFdr6Fy27s6T0T .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-oLCFdr6Fy27s6T0T .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-oLCFdr6Fy27s6T0T .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-oLCFdr6Fy27s6T0T .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-oLCFdr6Fy27s6T0T .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-oLCFdr6Fy27s6T0T .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-oLCFdr6Fy27s6T0T .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-oLCFdr6Fy27s6T0T .marker{fill:#333333;stroke:#333333;}#mermaid-svg-oLCFdr6Fy27s6T0T .marker.cross{stroke:#333333;}#mermaid-svg-oLCFdr6Fy27s6T0T svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-oLCFdr6Fy27s6T0T p{margin:0;}#mermaid-svg-oLCFdr6Fy27s6T0T .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-oLCFdr6Fy27s6T0T .cluster-label text{fill:#333;}#mermaid-svg-oLCFdr6Fy27s6T0T .cluster-label span{color:#333;}#mermaid-svg-oLCFdr6Fy27s6T0T .cluster-label span p{background-color:transparent;}#mermaid-svg-oLCFdr6Fy27s6T0T .label text,#mermaid-svg-oLCFdr6Fy27s6T0T span{fill:#333;color:#333;}#mermaid-svg-oLCFdr6Fy27s6T0T .node rect,#mermaid-svg-oLCFdr6Fy27s6T0T .node circle,#mermaid-svg-oLCFdr6Fy27s6T0T .node ellipse,#mermaid-svg-oLCFdr6Fy27s6T0T .node polygon,#mermaid-svg-oLCFdr6Fy27s6T0T .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oLCFdr6Fy27s6T0T .rough-node .label text,#mermaid-svg-oLCFdr6Fy27s6T0T .node .label text,#mermaid-svg-oLCFdr6Fy27s6T0T .image-shape .label,#mermaid-svg-oLCFdr6Fy27s6T0T .icon-shape .label{text-anchor:middle;}#mermaid-svg-oLCFdr6Fy27s6T0T .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-oLCFdr6Fy27s6T0T .rough-node .label,#mermaid-svg-oLCFdr6Fy27s6T0T .node .label,#mermaid-svg-oLCFdr6Fy27s6T0T .image-shape .label,#mermaid-svg-oLCFdr6Fy27s6T0T .icon-shape .label{text-align:center;}#mermaid-svg-oLCFdr6Fy27s6T0T .node.clickable{cursor:pointer;}#mermaid-svg-oLCFdr6Fy27s6T0T .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-oLCFdr6Fy27s6T0T .arrowheadPath{fill:#333333;}#mermaid-svg-oLCFdr6Fy27s6T0T .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-oLCFdr6Fy27s6T0T .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-oLCFdr6Fy27s6T0T .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oLCFdr6Fy27s6T0T .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-oLCFdr6Fy27s6T0T .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oLCFdr6Fy27s6T0T .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-oLCFdr6Fy27s6T0T .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-oLCFdr6Fy27s6T0T .cluster text{fill:#333;}#mermaid-svg-oLCFdr6Fy27s6T0T .cluster span{color:#333;}#mermaid-svg-oLCFdr6Fy27s6T0T div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-oLCFdr6Fy27s6T0T .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-oLCFdr6Fy27s6T0T rect.text{fill:none;stroke-width:0;}#mermaid-svg-oLCFdr6Fy27s6T0T .icon-shape,#mermaid-svg-oLCFdr6Fy27s6T0T .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oLCFdr6Fy27s6T0T .icon-shape p,#mermaid-svg-oLCFdr6Fy27s6T0T .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-oLCFdr6Fy27s6T0T .icon-shape .label rect,#mermaid-svg-oLCFdr6Fy27s6T0T .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oLCFdr6Fy27s6T0T .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-oLCFdr6Fy27s6T0T .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-oLCFdr6Fy27s6T0T :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-oLCFdr6Fy27s6T0T .root>*{fill:#42A5F5!important;stroke:#1565C0!important;color:#fff!important;}#mermaid-svg-oLCFdr6Fy27s6T0T .root span{fill:#42A5F5!important;stroke:#1565C0!important;color:#fff!important;}#mermaid-svg-oLCFdr6Fy27s6T0T .root tspan{fill:#fff!important;}#mermaid-svg-oLCFdr6Fy27s6T0T .inner>*{fill:#66BB6A!important;stroke:#2E7D32!important;color:#fff!important;}#mermaid-svg-oLCFdr6Fy27s6T0T .inner span{fill:#66BB6A!important;stroke:#2E7D32!important;color:#fff!important;}#mermaid-svg-oLCFdr6Fy27s6T0T .inner tspan{fill:#fff!important;}#mermaid-svg-oLCFdr6Fy27s6T0T .leaf>*{fill:#FFA726!important;stroke:#E65100!important;color:#fff!important;}#mermaid-svg-oLCFdr6Fy27s6T0T .leaf span{fill:#FFA726!important;stroke:#E65100!important;color:#fff!important;}#mermaid-svg-oLCFdr6Fy27s6T0T .leaf tspan{fill:#fff!important;} 根节点
50
内部节点
20, 30
内部节点
70, 90
叶子节点
10, 15
叶子节点
20, 25, 30
叶子节点
50, 60
叶子节点
70, 80, 90
B+Tree 的 3 大优势:
- ✅ 多路查找 :每个节点多个 key,树高度只有 3-4 层
- ✅ 范围查询快 :叶子节点形成有序链表
- ✅ 磁盘 IO 少:一次 IO 读一个节点(16KB)
1.4 索引的 3 大代价
| 代价 | 描述 |
|---|---|
| 写慢 | INSERT / UPDATE / DELETE 要同时维护索引 |
| 占空间 | 索引文件可能比数据文件还大 |
| 用错更慢 | 失效的索引反而拖慢查询 |
1.5 7 大核心地图
#mermaid-svg-JznXZj9gvTTBYrgA{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-JznXZj9gvTTBYrgA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-JznXZj9gvTTBYrgA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-JznXZj9gvTTBYrgA .error-icon{fill:#552222;}#mermaid-svg-JznXZj9gvTTBYrgA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JznXZj9gvTTBYrgA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-JznXZj9gvTTBYrgA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JznXZj9gvTTBYrgA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JznXZj9gvTTBYrgA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-JznXZj9gvTTBYrgA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JznXZj9gvTTBYrgA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JznXZj9gvTTBYrgA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JznXZj9gvTTBYrgA .marker.cross{stroke:#333333;}#mermaid-svg-JznXZj9gvTTBYrgA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JznXZj9gvTTBYrgA p{margin:0;}#mermaid-svg-JznXZj9gvTTBYrgA .edge{stroke-width:3;}#mermaid-svg-JznXZj9gvTTBYrgA .section--1 rect,#mermaid-svg-JznXZj9gvTTBYrgA .section--1 path,#mermaid-svg-JznXZj9gvTTBYrgA .section--1 circle,#mermaid-svg-JznXZj9gvTTBYrgA .section--1 polygon,#mermaid-svg-JznXZj9gvTTBYrgA .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .section--1 text{fill:#ffffff;}#mermaid-svg-JznXZj9gvTTBYrgA .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-JznXZj9gvTTBYrgA .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .edge-depth--1{stroke-width:17;}#mermaid-svg-JznXZj9gvTTBYrgA .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled,#mermaid-svg-JznXZj9gvTTBYrgA .disabled circle,#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:lightgray;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:#efefef;}#mermaid-svg-JznXZj9gvTTBYrgA .section-0 rect,#mermaid-svg-JznXZj9gvTTBYrgA .section-0 path,#mermaid-svg-JznXZj9gvTTBYrgA .section-0 circle,#mermaid-svg-JznXZj9gvTTBYrgA .section-0 polygon,#mermaid-svg-JznXZj9gvTTBYrgA .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-JznXZj9gvTTBYrgA .section-0 text{fill:black;}#mermaid-svg-JznXZj9gvTTBYrgA .node-icon-0{font-size:40px;color:black;}#mermaid-svg-JznXZj9gvTTBYrgA .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-JznXZj9gvTTBYrgA .edge-depth-0{stroke-width:14;}#mermaid-svg-JznXZj9gvTTBYrgA .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled,#mermaid-svg-JznXZj9gvTTBYrgA .disabled circle,#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:lightgray;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:#efefef;}#mermaid-svg-JznXZj9gvTTBYrgA .section-1 rect,#mermaid-svg-JznXZj9gvTTBYrgA .section-1 path,#mermaid-svg-JznXZj9gvTTBYrgA .section-1 circle,#mermaid-svg-JznXZj9gvTTBYrgA .section-1 polygon,#mermaid-svg-JznXZj9gvTTBYrgA .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .section-1 text{fill:black;}#mermaid-svg-JznXZj9gvTTBYrgA .node-icon-1{font-size:40px;color:black;}#mermaid-svg-JznXZj9gvTTBYrgA .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .edge-depth-1{stroke-width:11;}#mermaid-svg-JznXZj9gvTTBYrgA .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled,#mermaid-svg-JznXZj9gvTTBYrgA .disabled circle,#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:lightgray;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:#efefef;}#mermaid-svg-JznXZj9gvTTBYrgA .section-2 rect,#mermaid-svg-JznXZj9gvTTBYrgA .section-2 path,#mermaid-svg-JznXZj9gvTTBYrgA .section-2 circle,#mermaid-svg-JznXZj9gvTTBYrgA .section-2 polygon,#mermaid-svg-JznXZj9gvTTBYrgA .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .section-2 text{fill:#ffffff;}#mermaid-svg-JznXZj9gvTTBYrgA .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-JznXZj9gvTTBYrgA .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .edge-depth-2{stroke-width:8;}#mermaid-svg-JznXZj9gvTTBYrgA .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled,#mermaid-svg-JznXZj9gvTTBYrgA .disabled circle,#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:lightgray;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:#efefef;}#mermaid-svg-JznXZj9gvTTBYrgA .section-3 rect,#mermaid-svg-JznXZj9gvTTBYrgA .section-3 path,#mermaid-svg-JznXZj9gvTTBYrgA .section-3 circle,#mermaid-svg-JznXZj9gvTTBYrgA .section-3 polygon,#mermaid-svg-JznXZj9gvTTBYrgA .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .section-3 text{fill:black;}#mermaid-svg-JznXZj9gvTTBYrgA .node-icon-3{font-size:40px;color:black;}#mermaid-svg-JznXZj9gvTTBYrgA .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .edge-depth-3{stroke-width:5;}#mermaid-svg-JznXZj9gvTTBYrgA .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled,#mermaid-svg-JznXZj9gvTTBYrgA .disabled circle,#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:lightgray;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:#efefef;}#mermaid-svg-JznXZj9gvTTBYrgA .section-4 rect,#mermaid-svg-JznXZj9gvTTBYrgA .section-4 path,#mermaid-svg-JznXZj9gvTTBYrgA .section-4 circle,#mermaid-svg-JznXZj9gvTTBYrgA .section-4 polygon,#mermaid-svg-JznXZj9gvTTBYrgA .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .section-4 text{fill:black;}#mermaid-svg-JznXZj9gvTTBYrgA .node-icon-4{font-size:40px;color:black;}#mermaid-svg-JznXZj9gvTTBYrgA .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .edge-depth-4{stroke-width:2;}#mermaid-svg-JznXZj9gvTTBYrgA .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled,#mermaid-svg-JznXZj9gvTTBYrgA .disabled circle,#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:lightgray;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:#efefef;}#mermaid-svg-JznXZj9gvTTBYrgA .section-5 rect,#mermaid-svg-JznXZj9gvTTBYrgA .section-5 path,#mermaid-svg-JznXZj9gvTTBYrgA .section-5 circle,#mermaid-svg-JznXZj9gvTTBYrgA .section-5 polygon,#mermaid-svg-JznXZj9gvTTBYrgA .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .section-5 text{fill:black;}#mermaid-svg-JznXZj9gvTTBYrgA .node-icon-5{font-size:40px;color:black;}#mermaid-svg-JznXZj9gvTTBYrgA .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .edge-depth-5{stroke-width:-1;}#mermaid-svg-JznXZj9gvTTBYrgA .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled,#mermaid-svg-JznXZj9gvTTBYrgA .disabled circle,#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:lightgray;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:#efefef;}#mermaid-svg-JznXZj9gvTTBYrgA .section-6 rect,#mermaid-svg-JznXZj9gvTTBYrgA .section-6 path,#mermaid-svg-JznXZj9gvTTBYrgA .section-6 circle,#mermaid-svg-JznXZj9gvTTBYrgA .section-6 polygon,#mermaid-svg-JznXZj9gvTTBYrgA .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .section-6 text{fill:black;}#mermaid-svg-JznXZj9gvTTBYrgA .node-icon-6{font-size:40px;color:black;}#mermaid-svg-JznXZj9gvTTBYrgA .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .edge-depth-6{stroke-width:-4;}#mermaid-svg-JznXZj9gvTTBYrgA .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled,#mermaid-svg-JznXZj9gvTTBYrgA .disabled circle,#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:lightgray;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:#efefef;}#mermaid-svg-JznXZj9gvTTBYrgA .section-7 rect,#mermaid-svg-JznXZj9gvTTBYrgA .section-7 path,#mermaid-svg-JznXZj9gvTTBYrgA .section-7 circle,#mermaid-svg-JznXZj9gvTTBYrgA .section-7 polygon,#mermaid-svg-JznXZj9gvTTBYrgA .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .section-7 text{fill:black;}#mermaid-svg-JznXZj9gvTTBYrgA .node-icon-7{font-size:40px;color:black;}#mermaid-svg-JznXZj9gvTTBYrgA .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .edge-depth-7{stroke-width:-7;}#mermaid-svg-JznXZj9gvTTBYrgA .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled,#mermaid-svg-JznXZj9gvTTBYrgA .disabled circle,#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:lightgray;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:#efefef;}#mermaid-svg-JznXZj9gvTTBYrgA .section-8 rect,#mermaid-svg-JznXZj9gvTTBYrgA .section-8 path,#mermaid-svg-JznXZj9gvTTBYrgA .section-8 circle,#mermaid-svg-JznXZj9gvTTBYrgA .section-8 polygon,#mermaid-svg-JznXZj9gvTTBYrgA .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .section-8 text{fill:black;}#mermaid-svg-JznXZj9gvTTBYrgA .node-icon-8{font-size:40px;color:black;}#mermaid-svg-JznXZj9gvTTBYrgA .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .edge-depth-8{stroke-width:-10;}#mermaid-svg-JznXZj9gvTTBYrgA .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled,#mermaid-svg-JznXZj9gvTTBYrgA .disabled circle,#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:lightgray;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:#efefef;}#mermaid-svg-JznXZj9gvTTBYrgA .section-9 rect,#mermaid-svg-JznXZj9gvTTBYrgA .section-9 path,#mermaid-svg-JznXZj9gvTTBYrgA .section-9 circle,#mermaid-svg-JznXZj9gvTTBYrgA .section-9 polygon,#mermaid-svg-JznXZj9gvTTBYrgA .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .section-9 text{fill:black;}#mermaid-svg-JznXZj9gvTTBYrgA .node-icon-9{font-size:40px;color:black;}#mermaid-svg-JznXZj9gvTTBYrgA .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .edge-depth-9{stroke-width:-13;}#mermaid-svg-JznXZj9gvTTBYrgA .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled,#mermaid-svg-JznXZj9gvTTBYrgA .disabled circle,#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:lightgray;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:#efefef;}#mermaid-svg-JznXZj9gvTTBYrgA .section-10 rect,#mermaid-svg-JznXZj9gvTTBYrgA .section-10 path,#mermaid-svg-JznXZj9gvTTBYrgA .section-10 circle,#mermaid-svg-JznXZj9gvTTBYrgA .section-10 polygon,#mermaid-svg-JznXZj9gvTTBYrgA .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .section-10 text{fill:black;}#mermaid-svg-JznXZj9gvTTBYrgA .node-icon-10{font-size:40px;color:black;}#mermaid-svg-JznXZj9gvTTBYrgA .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .edge-depth-10{stroke-width:-16;}#mermaid-svg-JznXZj9gvTTBYrgA .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled,#mermaid-svg-JznXZj9gvTTBYrgA .disabled circle,#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:lightgray;}#mermaid-svg-JznXZj9gvTTBYrgA .disabled text{fill:#efefef;}#mermaid-svg-JznXZj9gvTTBYrgA .section-root rect,#mermaid-svg-JznXZj9gvTTBYrgA .section-root path,#mermaid-svg-JznXZj9gvTTBYrgA .section-root circle,#mermaid-svg-JznXZj9gvTTBYrgA .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-JznXZj9gvTTBYrgA .section-root text{fill:#ffffff;}#mermaid-svg-JznXZj9gvTTBYrgA .section-root span{color:#ffffff;}#mermaid-svg-JznXZj9gvTTBYrgA .section-2 span{color:#ffffff;}#mermaid-svg-JznXZj9gvTTBYrgA .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-JznXZj9gvTTBYrgA .edge{fill:none;}#mermaid-svg-JznXZj9gvTTBYrgA .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-JznXZj9gvTTBYrgA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} MySQL 索引
7 大核心
结构
聚簇 vs 非聚簇
语法
CRUD 增删改查
失效
10 大场景
优化
覆盖索引
最左前缀
索引下推 ICP
实战
EXPLAIN 调优
二、聚簇 vs 非聚簇索引
2.1 一句话定义
- 聚簇索引:数据的物理存储顺序和索引顺序一致
- 非聚簇索引:索引和数据分开存储
2.2 InnoDB vs MyISAM
#mermaid-svg-iacEqustijqc8fkF{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-iacEqustijqc8fkF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-iacEqustijqc8fkF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-iacEqustijqc8fkF .error-icon{fill:#552222;}#mermaid-svg-iacEqustijqc8fkF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-iacEqustijqc8fkF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-iacEqustijqc8fkF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-iacEqustijqc8fkF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-iacEqustijqc8fkF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-iacEqustijqc8fkF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-iacEqustijqc8fkF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-iacEqustijqc8fkF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-iacEqustijqc8fkF .marker.cross{stroke:#333333;}#mermaid-svg-iacEqustijqc8fkF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-iacEqustijqc8fkF p{margin:0;}#mermaid-svg-iacEqustijqc8fkF .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-iacEqustijqc8fkF .cluster-label text{fill:#333;}#mermaid-svg-iacEqustijqc8fkF .cluster-label span{color:#333;}#mermaid-svg-iacEqustijqc8fkF .cluster-label span p{background-color:transparent;}#mermaid-svg-iacEqustijqc8fkF .label text,#mermaid-svg-iacEqustijqc8fkF span{fill:#333;color:#333;}#mermaid-svg-iacEqustijqc8fkF .node rect,#mermaid-svg-iacEqustijqc8fkF .node circle,#mermaid-svg-iacEqustijqc8fkF .node ellipse,#mermaid-svg-iacEqustijqc8fkF .node polygon,#mermaid-svg-iacEqustijqc8fkF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-iacEqustijqc8fkF .rough-node .label text,#mermaid-svg-iacEqustijqc8fkF .node .label text,#mermaid-svg-iacEqustijqc8fkF .image-shape .label,#mermaid-svg-iacEqustijqc8fkF .icon-shape .label{text-anchor:middle;}#mermaid-svg-iacEqustijqc8fkF .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-iacEqustijqc8fkF .rough-node .label,#mermaid-svg-iacEqustijqc8fkF .node .label,#mermaid-svg-iacEqustijqc8fkF .image-shape .label,#mermaid-svg-iacEqustijqc8fkF .icon-shape .label{text-align:center;}#mermaid-svg-iacEqustijqc8fkF .node.clickable{cursor:pointer;}#mermaid-svg-iacEqustijqc8fkF .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-iacEqustijqc8fkF .arrowheadPath{fill:#333333;}#mermaid-svg-iacEqustijqc8fkF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-iacEqustijqc8fkF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-iacEqustijqc8fkF .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iacEqustijqc8fkF .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-iacEqustijqc8fkF .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iacEqustijqc8fkF .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-iacEqustijqc8fkF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-iacEqustijqc8fkF .cluster text{fill:#333;}#mermaid-svg-iacEqustijqc8fkF .cluster span{color:#333;}#mermaid-svg-iacEqustijqc8fkF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-iacEqustijqc8fkF .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-iacEqustijqc8fkF rect.text{fill:none;stroke-width:0;}#mermaid-svg-iacEqustijqc8fkF .icon-shape,#mermaid-svg-iacEqustijqc8fkF .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iacEqustijqc8fkF .icon-shape p,#mermaid-svg-iacEqustijqc8fkF .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-iacEqustijqc8fkF .icon-shape .label rect,#mermaid-svg-iacEqustijqc8fkF .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iacEqustijqc8fkF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-iacEqustijqc8fkF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-iacEqustijqc8fkF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-iacEqustijqc8fkF .good>*{fill:#66BB6A!important;stroke:#2E7D32!important;color:#fff!important;}#mermaid-svg-iacEqustijqc8fkF .good span{fill:#66BB6A!important;stroke:#2E7D32!important;color:#fff!important;}#mermaid-svg-iacEqustijqc8fkF .good tspan{fill:#fff!important;}#mermaid-svg-iacEqustijqc8fkF .bad>*{fill:#FF5252!important;stroke:#C62828!important;color:#fff!important;}#mermaid-svg-iacEqustijqc8fkF .bad span{fill:#FF5252!important;stroke:#C62828!important;color:#fff!important;}#mermaid-svg-iacEqustijqc8fkF .bad tspan{fill:#fff!important;} MyISAM(老古董)
非聚簇索引
索引和数据分开
叶子节点存地址
InnoDB(默认)
聚簇索引
数据 = 索引
叶子节点存数据
| 维度 | InnoDB(聚簇) | MyISAM(非聚簇) |
|---|---|---|
| 数据存储 | 索引叶子节点存数据 | 索引叶子节点存地址 |
| 主键 | 必须有(数据按主键组织) | 可以没有 |
| 二级索引 | 叶子节点存主键 | 叶子节点存地址 |
| 性能 | 快(少一次回表) | 慢(多一次寻址) |
2.3 回表查询(核心概念)
数据 聚簇索引(id) 二级索引(name) 业务代码 数据 聚簇索引(id) 二级索引(name) 业务代码 #mermaid-svg-PrH2fMnJJgL2Vdsp{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PrH2fMnJJgL2Vdsp .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PrH2fMnJJgL2Vdsp .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PrH2fMnJJgL2Vdsp .error-icon{fill:#552222;}#mermaid-svg-PrH2fMnJJgL2Vdsp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PrH2fMnJJgL2Vdsp .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PrH2fMnJJgL2Vdsp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PrH2fMnJJgL2Vdsp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PrH2fMnJJgL2Vdsp .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PrH2fMnJJgL2Vdsp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PrH2fMnJJgL2Vdsp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PrH2fMnJJgL2Vdsp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PrH2fMnJJgL2Vdsp .marker.cross{stroke:#333333;}#mermaid-svg-PrH2fMnJJgL2Vdsp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PrH2fMnJJgL2Vdsp p{margin:0;}#mermaid-svg-PrH2fMnJJgL2Vdsp .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-PrH2fMnJJgL2Vdsp text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-PrH2fMnJJgL2Vdsp .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-PrH2fMnJJgL2Vdsp .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-PrH2fMnJJgL2Vdsp .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-PrH2fMnJJgL2Vdsp .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-PrH2fMnJJgL2Vdsp #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-PrH2fMnJJgL2Vdsp .sequenceNumber{fill:white;}#mermaid-svg-PrH2fMnJJgL2Vdsp #sequencenumber{fill:#333;}#mermaid-svg-PrH2fMnJJgL2Vdsp #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-PrH2fMnJJgL2Vdsp .messageText{fill:#333;stroke:none;}#mermaid-svg-PrH2fMnJJgL2Vdsp .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-PrH2fMnJJgL2Vdsp .labelText,#mermaid-svg-PrH2fMnJJgL2Vdsp .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-PrH2fMnJJgL2Vdsp .loopText,#mermaid-svg-PrH2fMnJJgL2Vdsp .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-PrH2fMnJJgL2Vdsp .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-PrH2fMnJJgL2Vdsp .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-PrH2fMnJJgL2Vdsp .noteText,#mermaid-svg-PrH2fMnJJgL2Vdsp .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-PrH2fMnJJgL2Vdsp .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-PrH2fMnJJgL2Vdsp .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-PrH2fMnJJgL2Vdsp .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-PrH2fMnJJgL2Vdsp .actorPopupMenu{position:absolute;}#mermaid-svg-PrH2fMnJJgL2Vdsp .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-PrH2fMnJJgL2Vdsp .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-PrH2fMnJJgL2Vdsp .actor-man circle,#mermaid-svg-PrH2fMnJJgL2Vdsp line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-PrH2fMnJJgL2Vdsp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SELECT * WHERE name='张三'找到 name='张三'叶子节点 = id=10回表:用 id=10 查聚簇索引找到 id=10 的完整行返回 {id:10, name:'张三', age:30, ...}
"回表" :二级索引找到主键 → 用主键回聚簇索引找完整数据 → 多一次 IO。
2.4 关键点
- ✅ InnoDB 是聚簇索引,数据按主键组织
- ✅ 二级索引叶子节点存的是主键,不是数据
- ✅ 回表 = 用主键再查一次聚簇索引
- ❌ 不要用 UUID / 随机字符串做主键(B+Tree 频繁分裂)
- ✅ 推荐用自增 BIGINT 做主键
三、索引语法(CRUD)
3.1 创建索引
sql
-- ① 普通索引
CREATE INDEX idx_name ON user(name);
-- ② 唯一索引
CREATE UNIQUE INDEX uk_phone ON user(phone);
-- ③ 联合索引(多个字段)
CREATE INDEX idx_name_age ON user(name, age);
-- ④ 前缀索引(节省空间,字符串字段)
CREATE INDEX idx_email ON user(email(10));
-- ⑤ 建表时一起建
CREATE TABLE user (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT,
INDEX idx_name (name)
);
3.2 删除索引
sql
DROP INDEX idx_name ON user;
-- 或
ALTER TABLE user DROP INDEX idx_name;
3.3 查看索引
sql
SHOW INDEX FROM user;
3.4 修改索引
sql
-- 添加索引
ALTER TABLE user ADD INDEX idx_age (age);
-- 删除索引
ALTER TABLE user DROP INDEX idx_age;
3.5 关键点
- ✅
ALTER TABLE ADD INDEX比CREATE INDEX更常用(一条 SQL 改多个) - ✅ 联合索引字段顺序很重要(见下文)
- ✅
UNIQUE INDEX既能查重,又能加速查询 - ✅
PRIMARY KEY自动是唯一索引 - ❌ 生产环境不要乱建索引(写慢 + 占空间)
四、索引失效 10 大场景 ⭐ 重头
4.1 失效的本质
#mermaid-svg-RnAPXQelkhwGYXQj{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-RnAPXQelkhwGYXQj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-RnAPXQelkhwGYXQj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-RnAPXQelkhwGYXQj .error-icon{fill:#552222;}#mermaid-svg-RnAPXQelkhwGYXQj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-RnAPXQelkhwGYXQj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-RnAPXQelkhwGYXQj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-RnAPXQelkhwGYXQj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-RnAPXQelkhwGYXQj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-RnAPXQelkhwGYXQj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-RnAPXQelkhwGYXQj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-RnAPXQelkhwGYXQj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-RnAPXQelkhwGYXQj .marker.cross{stroke:#333333;}#mermaid-svg-RnAPXQelkhwGYXQj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-RnAPXQelkhwGYXQj p{margin:0;}#mermaid-svg-RnAPXQelkhwGYXQj .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-RnAPXQelkhwGYXQj .cluster-label text{fill:#333;}#mermaid-svg-RnAPXQelkhwGYXQj .cluster-label span{color:#333;}#mermaid-svg-RnAPXQelkhwGYXQj .cluster-label span p{background-color:transparent;}#mermaid-svg-RnAPXQelkhwGYXQj .label text,#mermaid-svg-RnAPXQelkhwGYXQj span{fill:#333;color:#333;}#mermaid-svg-RnAPXQelkhwGYXQj .node rect,#mermaid-svg-RnAPXQelkhwGYXQj .node circle,#mermaid-svg-RnAPXQelkhwGYXQj .node ellipse,#mermaid-svg-RnAPXQelkhwGYXQj .node polygon,#mermaid-svg-RnAPXQelkhwGYXQj .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-RnAPXQelkhwGYXQj .rough-node .label text,#mermaid-svg-RnAPXQelkhwGYXQj .node .label text,#mermaid-svg-RnAPXQelkhwGYXQj .image-shape .label,#mermaid-svg-RnAPXQelkhwGYXQj .icon-shape .label{text-anchor:middle;}#mermaid-svg-RnAPXQelkhwGYXQj .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-RnAPXQelkhwGYXQj .rough-node .label,#mermaid-svg-RnAPXQelkhwGYXQj .node .label,#mermaid-svg-RnAPXQelkhwGYXQj .image-shape .label,#mermaid-svg-RnAPXQelkhwGYXQj .icon-shape .label{text-align:center;}#mermaid-svg-RnAPXQelkhwGYXQj .node.clickable{cursor:pointer;}#mermaid-svg-RnAPXQelkhwGYXQj .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-RnAPXQelkhwGYXQj .arrowheadPath{fill:#333333;}#mermaid-svg-RnAPXQelkhwGYXQj .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-RnAPXQelkhwGYXQj .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-RnAPXQelkhwGYXQj .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RnAPXQelkhwGYXQj .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-RnAPXQelkhwGYXQj .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RnAPXQelkhwGYXQj .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-RnAPXQelkhwGYXQj .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-RnAPXQelkhwGYXQj .cluster text{fill:#333;}#mermaid-svg-RnAPXQelkhwGYXQj .cluster span{color:#333;}#mermaid-svg-RnAPXQelkhwGYXQj div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-RnAPXQelkhwGYXQj .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-RnAPXQelkhwGYXQj rect.text{fill:none;stroke-width:0;}#mermaid-svg-RnAPXQelkhwGYXQj .icon-shape,#mermaid-svg-RnAPXQelkhwGYXQj .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RnAPXQelkhwGYXQj .icon-shape p,#mermaid-svg-RnAPXQelkhwGYXQj .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-RnAPXQelkhwGYXQj .icon-shape .label rect,#mermaid-svg-RnAPXQelkhwGYXQj .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RnAPXQelkhwGYXQj .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-RnAPXQelkhwGYXQj .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-RnAPXQelkhwGYXQj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-RnAPXQelkhwGYXQj .good>*{fill:#66BB6A!important;stroke:#2E7D32!important;color:#fff!important;}#mermaid-svg-RnAPXQelkhwGYXQj .good span{fill:#66BB6A!important;stroke:#2E7D32!important;color:#fff!important;}#mermaid-svg-RnAPXQelkhwGYXQj .good tspan{fill:#fff!important;}#mermaid-svg-RnAPXQelkhwGYXQj .bad>*{fill:#FF5252!important;stroke:#C62828!important;color:#fff!important;}#mermaid-svg-RnAPXQelkhwGYXQj .bad span{fill:#FF5252!important;stroke:#C62828!important;color:#fff!important;}#mermaid-svg-RnAPXQelkhwGYXQj .bad tspan{fill:#fff!important;} 是
否
WHERE 条件
符合最左前缀?
类型转换?
函数运算?
✅ 走索引
❌ 全表扫描
4.2 10 大失效场景
| # | 场景 | 反例 | 正例 |
|---|---|---|---|
| 1 | 最左前缀违反 | WHERE age=20(name 丢了) |
WHERE name='张三' AND age=20 |
| 2 | 范围条件右边失效 | WHERE name='张三' AND age>20 AND status=1 |
范围放最后 |
| 3 | LIKE 左模糊 | WHERE name LIKE '%三' |
WHERE name LIKE '张%' |
| 4 | 类型转换 | WHERE phone=13800138000(phone 是 varchar) |
WHERE phone='13800138000' |
| 5 | 函数运算 | WHERE YEAR(create_time)=2024 |
WHERE create_time BETWEEN '2024-01-01' AND '2024-12-31' |
| 6 | OR 不全有索引 | WHERE name='张三' OR age=20(age 无索引) |
给 age 建索引 |
| 7 | 不等于 != / <> | WHERE status != 1 |
业务上重写为 IN 或 = |
| 8 | IS NULL / IS NOT NULL | WHERE name IS NULL |
视情况而定 |
| 9 | 数据量小 | 表只有 100 行 | MySQL 优化器主动放弃索引 |
| 10 | ORDER BY 无索引 | SELECT * ORDER BY name |
建联合索引 |
4.3 失效场景详解(重点 3 个)
场景 1:最左前缀违反(最常踩)
sql
-- 联合索引 (name, age, status)
-- ❌ 失效:跳过 name
SELECT * FROM user WHERE age = 20;
-- ✅ 生效:从 name 开始
SELECT * FROM user WHERE name = '张三' AND age = 20;
场景 2:范围条件右边失效
sql
-- 联合索引 (name, age, status)
-- ❌ 失效:status 失效(age 是范围)
SELECT * FROM user WHERE name='张三' AND age>20 AND status=1;
-- ✅ 改写:把范围放最后
SELECT * FROM user WHERE name='张三' AND status=1 AND age>20;
场景 3:类型转换
sql
-- phone 是 varchar,有索引
-- ❌ 失效:phone=数字(MySQL 隐式转换)
SELECT * FROM user WHERE phone = 13800138000;
-- ✅ 生效:phone=字符串
SELECT * FROM user WHERE phone = '13800138000';
4.4 关键点
- ✅ 所有字段都要符合最左前缀
- ✅ 范围条件放最后
- ✅ 类型要匹配(数字 ≠ 字符串)
- ❌ 不要在索引列上做运算 / 函数
- ❌ OR 两边都要有索引
五、覆盖索引
5.1 一句话定义
覆盖索引 = 索引包含查询所需的全部字段,不需要回表。
5.2 为什么覆盖索引快?
#mermaid-svg-IXYPtdA6jiquGirq{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IXYPtdA6jiquGirq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IXYPtdA6jiquGirq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IXYPtdA6jiquGirq .error-icon{fill:#552222;}#mermaid-svg-IXYPtdA6jiquGirq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IXYPtdA6jiquGirq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IXYPtdA6jiquGirq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IXYPtdA6jiquGirq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IXYPtdA6jiquGirq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IXYPtdA6jiquGirq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IXYPtdA6jiquGirq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IXYPtdA6jiquGirq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IXYPtdA6jiquGirq .marker.cross{stroke:#333333;}#mermaid-svg-IXYPtdA6jiquGirq svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IXYPtdA6jiquGirq p{margin:0;}#mermaid-svg-IXYPtdA6jiquGirq .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-IXYPtdA6jiquGirq .cluster-label text{fill:#333;}#mermaid-svg-IXYPtdA6jiquGirq .cluster-label span{color:#333;}#mermaid-svg-IXYPtdA6jiquGirq .cluster-label span p{background-color:transparent;}#mermaid-svg-IXYPtdA6jiquGirq .label text,#mermaid-svg-IXYPtdA6jiquGirq span{fill:#333;color:#333;}#mermaid-svg-IXYPtdA6jiquGirq .node rect,#mermaid-svg-IXYPtdA6jiquGirq .node circle,#mermaid-svg-IXYPtdA6jiquGirq .node ellipse,#mermaid-svg-IXYPtdA6jiquGirq .node polygon,#mermaid-svg-IXYPtdA6jiquGirq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IXYPtdA6jiquGirq .rough-node .label text,#mermaid-svg-IXYPtdA6jiquGirq .node .label text,#mermaid-svg-IXYPtdA6jiquGirq .image-shape .label,#mermaid-svg-IXYPtdA6jiquGirq .icon-shape .label{text-anchor:middle;}#mermaid-svg-IXYPtdA6jiquGirq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-IXYPtdA6jiquGirq .rough-node .label,#mermaid-svg-IXYPtdA6jiquGirq .node .label,#mermaid-svg-IXYPtdA6jiquGirq .image-shape .label,#mermaid-svg-IXYPtdA6jiquGirq .icon-shape .label{text-align:center;}#mermaid-svg-IXYPtdA6jiquGirq .node.clickable{cursor:pointer;}#mermaid-svg-IXYPtdA6jiquGirq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-IXYPtdA6jiquGirq .arrowheadPath{fill:#333333;}#mermaid-svg-IXYPtdA6jiquGirq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IXYPtdA6jiquGirq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IXYPtdA6jiquGirq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IXYPtdA6jiquGirq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-IXYPtdA6jiquGirq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IXYPtdA6jiquGirq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-IXYPtdA6jiquGirq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IXYPtdA6jiquGirq .cluster text{fill:#333;}#mermaid-svg-IXYPtdA6jiquGirq .cluster span{color:#333;}#mermaid-svg-IXYPtdA6jiquGirq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-IXYPtdA6jiquGirq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-IXYPtdA6jiquGirq rect.text{fill:none;stroke-width:0;}#mermaid-svg-IXYPtdA6jiquGirq .icon-shape,#mermaid-svg-IXYPtdA6jiquGirq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IXYPtdA6jiquGirq .icon-shape p,#mermaid-svg-IXYPtdA6jiquGirq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-IXYPtdA6jiquGirq .icon-shape .label rect,#mermaid-svg-IXYPtdA6jiquGirq .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IXYPtdA6jiquGirq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-IXYPtdA6jiquGirq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-IXYPtdA6jiquGirq :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-IXYPtdA6jiquGirq .normal>*{fill:#FFA726!important;stroke:#E65100!important;color:#fff!important;}#mermaid-svg-IXYPtdA6jiquGirq .normal span{fill:#FFA726!important;stroke:#E65100!important;color:#fff!important;}#mermaid-svg-IXYPtdA6jiquGirq .normal tspan{fill:#fff!important;}#mermaid-svg-IXYPtdA6jiquGirq .cover>*{fill:#66BB6A!important;stroke:#2E7D32!important;color:#fff!important;}#mermaid-svg-IXYPtdA6jiquGirq .cover span{fill:#66BB6A!important;stroke:#2E7D32!important;color:#fff!important;}#mermaid-svg-IXYPtdA6jiquGirq .cover tspan{fill:#fff!important;} 普通索引
索引找到 id
回表查完整行
返回数据
覆盖索引
索引直接返回字段
不需要回表
5.3 实战对比
sql
-- 表 user 有联合索引 (name, age)
-- ❌ 不覆盖:需要回表(SELECT *)
SELECT * FROM user WHERE name = '张三';
-- ✅ 覆盖:不需要回表
SELECT name, age FROM user WHERE name = '张三';
5.4 实战技巧:分页查询
sql
-- 表 order 有联合索引 (user_id, status, create_time)
-- ❌ 不覆盖
SELECT * FROM order WHERE user_id = 123 ORDER BY create_time DESC LIMIT 20;
-- ✅ 覆盖:先查主键,再回表
SELECT id FROM order WHERE user_id = 123 ORDER BY create_time DESC LIMIT 20;
-- 然后用 id 查完整数据
好处 :先查主键(走覆盖索引)→ 用主键查完整行 → 避免大量回表。
5.5 关键点
- ✅ 覆盖索引 = 不回表
- ✅
SELECT字段全部在索引里 即可覆盖 - ✅ 分页查询 + 覆盖索引:先查 id,再回表
- ✅
EXPLAIN看 Extra 列 :出现Using index就是覆盖索引 - ❌
SELECT *大概率不覆盖
六、最左前缀原则
6.1 一句话定义
联合索引 (a, b, c) = 3 个索引:(a) + (a, b) + (a, b, c),但不是 (b, c)。
6.2 图解
#mermaid-svg-SzPunwjX6ZGu6SzU{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SzPunwjX6ZGu6SzU .error-icon{fill:#552222;}#mermaid-svg-SzPunwjX6ZGu6SzU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SzPunwjX6ZGu6SzU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SzPunwjX6ZGu6SzU .marker.cross{stroke:#333333;}#mermaid-svg-SzPunwjX6ZGu6SzU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SzPunwjX6ZGu6SzU p{margin:0;}#mermaid-svg-SzPunwjX6ZGu6SzU .edge{stroke-width:3;}#mermaid-svg-SzPunwjX6ZGu6SzU .section--1 rect,#mermaid-svg-SzPunwjX6ZGu6SzU .section--1 path,#mermaid-svg-SzPunwjX6ZGu6SzU .section--1 circle,#mermaid-svg-SzPunwjX6ZGu6SzU .section--1 polygon,#mermaid-svg-SzPunwjX6ZGu6SzU .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .section--1 text{fill:#ffffff;}#mermaid-svg-SzPunwjX6ZGu6SzU .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-depth--1{stroke-width:17;}#mermaid-svg-SzPunwjX6ZGu6SzU .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled circle,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:lightgray;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:#efefef;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-0 rect,#mermaid-svg-SzPunwjX6ZGu6SzU .section-0 path,#mermaid-svg-SzPunwjX6ZGu6SzU .section-0 circle,#mermaid-svg-SzPunwjX6ZGu6SzU .section-0 polygon,#mermaid-svg-SzPunwjX6ZGu6SzU .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-SzPunwjX6ZGu6SzU .section-0 text{fill:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .node-icon-0{font-size:40px;color:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-depth-0{stroke-width:14;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled circle,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:lightgray;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:#efefef;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-1 rect,#mermaid-svg-SzPunwjX6ZGu6SzU .section-1 path,#mermaid-svg-SzPunwjX6ZGu6SzU .section-1 circle,#mermaid-svg-SzPunwjX6ZGu6SzU .section-1 polygon,#mermaid-svg-SzPunwjX6ZGu6SzU .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .section-1 text{fill:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .node-icon-1{font-size:40px;color:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-depth-1{stroke-width:11;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled circle,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:lightgray;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:#efefef;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-2 rect,#mermaid-svg-SzPunwjX6ZGu6SzU .section-2 path,#mermaid-svg-SzPunwjX6ZGu6SzU .section-2 circle,#mermaid-svg-SzPunwjX6ZGu6SzU .section-2 polygon,#mermaid-svg-SzPunwjX6ZGu6SzU .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .section-2 text{fill:#ffffff;}#mermaid-svg-SzPunwjX6ZGu6SzU .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-depth-2{stroke-width:8;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled circle,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:lightgray;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:#efefef;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-3 rect,#mermaid-svg-SzPunwjX6ZGu6SzU .section-3 path,#mermaid-svg-SzPunwjX6ZGu6SzU .section-3 circle,#mermaid-svg-SzPunwjX6ZGu6SzU .section-3 polygon,#mermaid-svg-SzPunwjX6ZGu6SzU .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .section-3 text{fill:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .node-icon-3{font-size:40px;color:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-depth-3{stroke-width:5;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled circle,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:lightgray;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:#efefef;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-4 rect,#mermaid-svg-SzPunwjX6ZGu6SzU .section-4 path,#mermaid-svg-SzPunwjX6ZGu6SzU .section-4 circle,#mermaid-svg-SzPunwjX6ZGu6SzU .section-4 polygon,#mermaid-svg-SzPunwjX6ZGu6SzU .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .section-4 text{fill:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .node-icon-4{font-size:40px;color:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-depth-4{stroke-width:2;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled circle,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:lightgray;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:#efefef;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-5 rect,#mermaid-svg-SzPunwjX6ZGu6SzU .section-5 path,#mermaid-svg-SzPunwjX6ZGu6SzU .section-5 circle,#mermaid-svg-SzPunwjX6ZGu6SzU .section-5 polygon,#mermaid-svg-SzPunwjX6ZGu6SzU .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .section-5 text{fill:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .node-icon-5{font-size:40px;color:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-depth-5{stroke-width:-1;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled circle,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:lightgray;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:#efefef;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-6 rect,#mermaid-svg-SzPunwjX6ZGu6SzU .section-6 path,#mermaid-svg-SzPunwjX6ZGu6SzU .section-6 circle,#mermaid-svg-SzPunwjX6ZGu6SzU .section-6 polygon,#mermaid-svg-SzPunwjX6ZGu6SzU .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .section-6 text{fill:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .node-icon-6{font-size:40px;color:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-depth-6{stroke-width:-4;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled circle,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:lightgray;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:#efefef;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-7 rect,#mermaid-svg-SzPunwjX6ZGu6SzU .section-7 path,#mermaid-svg-SzPunwjX6ZGu6SzU .section-7 circle,#mermaid-svg-SzPunwjX6ZGu6SzU .section-7 polygon,#mermaid-svg-SzPunwjX6ZGu6SzU .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .section-7 text{fill:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .node-icon-7{font-size:40px;color:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-depth-7{stroke-width:-7;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled circle,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:lightgray;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:#efefef;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-8 rect,#mermaid-svg-SzPunwjX6ZGu6SzU .section-8 path,#mermaid-svg-SzPunwjX6ZGu6SzU .section-8 circle,#mermaid-svg-SzPunwjX6ZGu6SzU .section-8 polygon,#mermaid-svg-SzPunwjX6ZGu6SzU .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .section-8 text{fill:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .node-icon-8{font-size:40px;color:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-depth-8{stroke-width:-10;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled circle,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:lightgray;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:#efefef;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-9 rect,#mermaid-svg-SzPunwjX6ZGu6SzU .section-9 path,#mermaid-svg-SzPunwjX6ZGu6SzU .section-9 circle,#mermaid-svg-SzPunwjX6ZGu6SzU .section-9 polygon,#mermaid-svg-SzPunwjX6ZGu6SzU .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .section-9 text{fill:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .node-icon-9{font-size:40px;color:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-depth-9{stroke-width:-13;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled circle,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:lightgray;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:#efefef;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-10 rect,#mermaid-svg-SzPunwjX6ZGu6SzU .section-10 path,#mermaid-svg-SzPunwjX6ZGu6SzU .section-10 circle,#mermaid-svg-SzPunwjX6ZGu6SzU .section-10 polygon,#mermaid-svg-SzPunwjX6ZGu6SzU .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .section-10 text{fill:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .node-icon-10{font-size:40px;color:black;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .edge-depth-10{stroke-width:-16;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled circle,#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:lightgray;}#mermaid-svg-SzPunwjX6ZGu6SzU .disabled text{fill:#efefef;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-root rect,#mermaid-svg-SzPunwjX6ZGu6SzU .section-root path,#mermaid-svg-SzPunwjX6ZGu6SzU .section-root circle,#mermaid-svg-SzPunwjX6ZGu6SzU .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-SzPunwjX6ZGu6SzU .section-root text{fill:#ffffff;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-root span{color:#ffffff;}#mermaid-svg-SzPunwjX6ZGu6SzU .section-2 span{color:#ffffff;}#mermaid-svg-SzPunwjX6ZGu6SzU .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-SzPunwjX6ZGu6SzU .edge{fill:none;}#mermaid-svg-SzPunwjX6ZGu6SzU .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-SzPunwjX6ZGu6SzU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 联合索引
name, age, status
生效
name
name + age
name + age + status
失效
age
status
age + status
6.3 实战对比
sql
-- 联合索引 (name, age, status)
-- ✅ 生效:3 段都走索引
SELECT * FROM user WHERE name='张三' AND age=20 AND status=1;
-- ✅ 生效:name 段
SELECT * FROM user WHERE name='张三';
-- ✅ 生效:name + age 段
SELECT * FROM user WHERE name='张三' AND age=20;
-- ❌ 失效:跳过 name
SELECT * FROM user WHERE age=20;
-- ❌ 失效:只查 status
SELECT * FROM user WHERE status=1;
-- ❌ 失效:age + status(不连续)
SELECT * FROM user WHERE age=20 AND status=1;
6.4 字段顺序怎么定?
口诀 :"高频在前,等值在前,范围在后"
| 字段 | 顺序 | 原因 |
|---|---|---|
| 高频查询字段 | 1 | 最左前缀必须用它 |
| 等值条件 | 2 | 范围之前 |
| 范围条件 | 最后 | 范围之后字段失效 |
6.5 关键点
- ✅ 最左前缀 = 联合索引从最左字段开始生效
- ✅ 跳过中间字段,后续全部失效
- ✅ 字段顺序:高频在前,等值在前,范围在后
- ❌ 不要按字段名字母顺序排
- ❌ 不要所有字段都建联合索引
七、索引下推 ICP
7.1 一句话定义
索引下推(ICP)= MySQL 5.6+ 优化器把 WHERE 条件下推到存储引擎层,减少回表。
7.2 没有 ICP 时
sql
-- 联合索引 (name, age)
-- WHERE name LIKE '张%' AND age = 20
-- 没有 ICP:
-- 1. 二级索引找到所有 name LIKE '张%' 的 id(不回表)
-- 2. 用 id 回聚簇索引查完整行
-- 3. 在 Server 层过滤 age = 20
-- ❌ 回表 N 次(所有 name LIKE '张%' 的行)
7.3 有 ICP 时
sql
-- 有 ICP:
-- 1. 二级索引找到所有 name LIKE '张%' AND age = 20 的 id
-- ★ 关键:在存储引擎层就过滤了 age = 20
-- 2. 用 id 回聚簇索引查完整行
-- ✅ 只回表满足 age=20 的行
7.4 关键点
- ✅ MySQL 5.6+ 默认开启
- ✅
EXPLAIN看 Extra 列 :出现Using index condition就是 ICP - ✅ 联合索引生效时,范围条件尽量放最后(让 ICP 过滤更多)
- ❌ 不需要手动开启(默认开启)
八、EXPLAIN 调优实战 ⭐ 终极武器
8.1 一句话定义
EXPLAIN = MySQL 的"慢 SQL 显微镜",告诉你这条 SQL 走没走索引、走哪个索引、扫多少行。
8.2 EXPLAIN 12 大字段
sql
EXPLAIN SELECT * FROM user WHERE name = '张三';
| 字段 | 含义 | 重点关注 |
|---|---|---|
| id | 查询序号 | 同 SELECT 一样大 |
| select_type | 查询类型 | SIMPLE / SUBQUERY |
| table | 表名 | - |
| type | 访问类型 | ⭐⭐⭐⭐⭐ |
| possible_keys | 可能用的索引 | - |
| key | 实际用的索引 | ⭐⭐⭐⭐⭐ |
| key_len | 索引长度 | 联合索引看哪几个字段生效 |
| ref | 索引比较的列 | const / func |
| rows | 扫描行数 | ⭐⭐⭐⭐ |
| filtered | 过滤比例 | 百分比 |
| Extra | 额外信息 | ⭐⭐⭐⭐⭐ |
8.3 type 访问类型(最重要)
#mermaid-svg-QpE2gj10Lhu2Fzci{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-QpE2gj10Lhu2Fzci .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-QpE2gj10Lhu2Fzci .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-QpE2gj10Lhu2Fzci .error-icon{fill:#552222;}#mermaid-svg-QpE2gj10Lhu2Fzci .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-QpE2gj10Lhu2Fzci .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-QpE2gj10Lhu2Fzci .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-QpE2gj10Lhu2Fzci .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-QpE2gj10Lhu2Fzci .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-QpE2gj10Lhu2Fzci .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-QpE2gj10Lhu2Fzci .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-QpE2gj10Lhu2Fzci .marker{fill:#333333;stroke:#333333;}#mermaid-svg-QpE2gj10Lhu2Fzci .marker.cross{stroke:#333333;}#mermaid-svg-QpE2gj10Lhu2Fzci svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-QpE2gj10Lhu2Fzci p{margin:0;}#mermaid-svg-QpE2gj10Lhu2Fzci .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-QpE2gj10Lhu2Fzci .cluster-label text{fill:#333;}#mermaid-svg-QpE2gj10Lhu2Fzci .cluster-label span{color:#333;}#mermaid-svg-QpE2gj10Lhu2Fzci .cluster-label span p{background-color:transparent;}#mermaid-svg-QpE2gj10Lhu2Fzci .label text,#mermaid-svg-QpE2gj10Lhu2Fzci span{fill:#333;color:#333;}#mermaid-svg-QpE2gj10Lhu2Fzci .node rect,#mermaid-svg-QpE2gj10Lhu2Fzci .node circle,#mermaid-svg-QpE2gj10Lhu2Fzci .node ellipse,#mermaid-svg-QpE2gj10Lhu2Fzci .node polygon,#mermaid-svg-QpE2gj10Lhu2Fzci .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-QpE2gj10Lhu2Fzci .rough-node .label text,#mermaid-svg-QpE2gj10Lhu2Fzci .node .label text,#mermaid-svg-QpE2gj10Lhu2Fzci .image-shape .label,#mermaid-svg-QpE2gj10Lhu2Fzci .icon-shape .label{text-anchor:middle;}#mermaid-svg-QpE2gj10Lhu2Fzci .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-QpE2gj10Lhu2Fzci .rough-node .label,#mermaid-svg-QpE2gj10Lhu2Fzci .node .label,#mermaid-svg-QpE2gj10Lhu2Fzci .image-shape .label,#mermaid-svg-QpE2gj10Lhu2Fzci .icon-shape .label{text-align:center;}#mermaid-svg-QpE2gj10Lhu2Fzci .node.clickable{cursor:pointer;}#mermaid-svg-QpE2gj10Lhu2Fzci .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-QpE2gj10Lhu2Fzci .arrowheadPath{fill:#333333;}#mermaid-svg-QpE2gj10Lhu2Fzci .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-QpE2gj10Lhu2Fzci .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-QpE2gj10Lhu2Fzci .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-QpE2gj10Lhu2Fzci .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-QpE2gj10Lhu2Fzci .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-QpE2gj10Lhu2Fzci .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-QpE2gj10Lhu2Fzci .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-QpE2gj10Lhu2Fzci .cluster text{fill:#333;}#mermaid-svg-QpE2gj10Lhu2Fzci .cluster span{color:#333;}#mermaid-svg-QpE2gj10Lhu2Fzci div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-QpE2gj10Lhu2Fzci .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-QpE2gj10Lhu2Fzci rect.text{fill:none;stroke-width:0;}#mermaid-svg-QpE2gj10Lhu2Fzci .icon-shape,#mermaid-svg-QpE2gj10Lhu2Fzci .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-QpE2gj10Lhu2Fzci .icon-shape p,#mermaid-svg-QpE2gj10Lhu2Fzci .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-QpE2gj10Lhu2Fzci .icon-shape .label rect,#mermaid-svg-QpE2gj10Lhu2Fzci .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-QpE2gj10Lhu2Fzci .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-QpE2gj10Lhu2Fzci .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-QpE2gj10Lhu2Fzci :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-QpE2gj10Lhu2Fzci .good>*{fill:#66BB6A!important;stroke:#2E7D32!important;color:#fff!important;}#mermaid-svg-QpE2gj10Lhu2Fzci .good span{fill:#66BB6A!important;stroke:#2E7D32!important;color:#fff!important;}#mermaid-svg-QpE2gj10Lhu2Fzci .good tspan{fill:#fff!important;}#mermaid-svg-QpE2gj10Lhu2Fzci .bad>*{fill:#FF5252!important;stroke:#C62828!important;color:#fff!important;}#mermaid-svg-QpE2gj10Lhu2Fzci .bad span{fill:#FF5252!important;stroke:#C62828!important;color:#fff!important;}#mermaid-svg-QpE2gj10Lhu2Fzci .bad tspan{fill:#fff!important;} system
const
eq_ref
ref
range
index
ALL
❌ 全表扫描
| type | 含义 | 性能 |
|---|---|---|
| system | 表只有 1 行 | ⭐⭐⭐⭐⭐ |
| const | 主键 / 唯一索引等值 | ⭐⭐⭐⭐⭐ |
| eq_ref | JOIN 主键 / 唯一索引 | ⭐⭐⭐⭐⭐ |
| ref | 非唯一索引等值 | ⭐⭐⭐⭐ |
| range | 范围扫描 | ⭐⭐⭐ |
| index | 全索引扫描 | ⭐⭐ |
| ALL | 全表扫描 | ❌ |
8.4 Extra 常见值
| 值 | 含义 | 处理 |
|---|---|---|
| Using index | 覆盖索引 | ✅ 好 |
| Using where | Server 层过滤 | 正常 |
| Using index condition | ICP 生效 | ✅ 好 |
| Using filesort | 额外排序 | ⚠️ 优化 |
| Using temporary | 临时表 | ⚠️ 优化 |
| Using join buffer | JOIN 缓冲 | 正常 |
8.5 实战调优案例
慢 SQL:
sql
SELECT * FROM order WHERE user_id = 123 AND status = 1 ORDER BY create_time DESC LIMIT 20;
EXPLAIN 一下:
type: ref
key: idx_user_id ← 只用到了 user_id 索引
rows: 50000 ← 扫了 5w 行
Extra: Using filesort ← 额外排序
优化:
sql
-- 建联合索引(user_id, status, create_time)
CREATE INDEX idx_user_status_time ON order(user_id, status, create_time);
-- EXPLAIN 再查
-- type: ref
-- key: idx_user_status_time ← 用到 3 字段联合索引
-- rows: 20 ← 只扫 20 行
-- Extra: Using index condition ← ICP 生效
优化结果 :5w 行 → 20 行,从 5 秒到 50ms。
8.6 关键点
- ✅
type至少要到ref,ALL必须优化 - ✅
key看实际用到的索引 - ✅
rows越小越好 - ✅
Using filesort/Using temporary要警惕 - ✅ EXPLAIN 是慢 SQL 调优的第一步
九、7 大核心的关系图
#mermaid-svg-TMv8IVnMv9gpWJTH{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-TMv8IVnMv9gpWJTH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-TMv8IVnMv9gpWJTH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-TMv8IVnMv9gpWJTH .error-icon{fill:#552222;}#mermaid-svg-TMv8IVnMv9gpWJTH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-TMv8IVnMv9gpWJTH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-TMv8IVnMv9gpWJTH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-TMv8IVnMv9gpWJTH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-TMv8IVnMv9gpWJTH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-TMv8IVnMv9gpWJTH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-TMv8IVnMv9gpWJTH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-TMv8IVnMv9gpWJTH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-TMv8IVnMv9gpWJTH .marker.cross{stroke:#333333;}#mermaid-svg-TMv8IVnMv9gpWJTH svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-TMv8IVnMv9gpWJTH p{margin:0;}#mermaid-svg-TMv8IVnMv9gpWJTH .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-TMv8IVnMv9gpWJTH .cluster-label text{fill:#333;}#mermaid-svg-TMv8IVnMv9gpWJTH .cluster-label span{color:#333;}#mermaid-svg-TMv8IVnMv9gpWJTH .cluster-label span p{background-color:transparent;}#mermaid-svg-TMv8IVnMv9gpWJTH .label text,#mermaid-svg-TMv8IVnMv9gpWJTH span{fill:#333;color:#333;}#mermaid-svg-TMv8IVnMv9gpWJTH .node rect,#mermaid-svg-TMv8IVnMv9gpWJTH .node circle,#mermaid-svg-TMv8IVnMv9gpWJTH .node ellipse,#mermaid-svg-TMv8IVnMv9gpWJTH .node polygon,#mermaid-svg-TMv8IVnMv9gpWJTH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-TMv8IVnMv9gpWJTH .rough-node .label text,#mermaid-svg-TMv8IVnMv9gpWJTH .node .label text,#mermaid-svg-TMv8IVnMv9gpWJTH .image-shape .label,#mermaid-svg-TMv8IVnMv9gpWJTH .icon-shape .label{text-anchor:middle;}#mermaid-svg-TMv8IVnMv9gpWJTH .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-TMv8IVnMv9gpWJTH .rough-node .label,#mermaid-svg-TMv8IVnMv9gpWJTH .node .label,#mermaid-svg-TMv8IVnMv9gpWJTH .image-shape .label,#mermaid-svg-TMv8IVnMv9gpWJTH .icon-shape .label{text-align:center;}#mermaid-svg-TMv8IVnMv9gpWJTH .node.clickable{cursor:pointer;}#mermaid-svg-TMv8IVnMv9gpWJTH .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-TMv8IVnMv9gpWJTH .arrowheadPath{fill:#333333;}#mermaid-svg-TMv8IVnMv9gpWJTH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-TMv8IVnMv9gpWJTH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-TMv8IVnMv9gpWJTH .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TMv8IVnMv9gpWJTH .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-TMv8IVnMv9gpWJTH .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TMv8IVnMv9gpWJTH .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-TMv8IVnMv9gpWJTH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-TMv8IVnMv9gpWJTH .cluster text{fill:#333;}#mermaid-svg-TMv8IVnMv9gpWJTH .cluster span{color:#333;}#mermaid-svg-TMv8IVnMv9gpWJTH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-TMv8IVnMv9gpWJTH .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-TMv8IVnMv9gpWJTH rect.text{fill:none;stroke-width:0;}#mermaid-svg-TMv8IVnMv9gpWJTH .icon-shape,#mermaid-svg-TMv8IVnMv9gpWJTH .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TMv8IVnMv9gpWJTH .icon-shape p,#mermaid-svg-TMv8IVnMv9gpWJTH .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-TMv8IVnMv9gpWJTH .icon-shape .label rect,#mermaid-svg-TMv8IVnMv9gpWJTH .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TMv8IVnMv9gpWJTH .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-TMv8IVnMv9gpWJTH .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-TMv8IVnMv9gpWJTH :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-TMv8IVnMv9gpWJTH .base>*{fill:#9013FE!important;stroke:#5C00B3!important;color:#fff!important;}#mermaid-svg-TMv8IVnMv9gpWJTH .base span{fill:#9013FE!important;stroke:#5C00B3!important;color:#fff!important;}#mermaid-svg-TMv8IVnMv9gpWJTH .base tspan{fill:#fff!important;}#mermaid-svg-TMv8IVnMv9gpWJTH .use>*{fill:#42A5F5!important;stroke:#1565C0!important;color:#fff!important;}#mermaid-svg-TMv8IVnMv9gpWJTH .use span{fill:#42A5F5!important;stroke:#1565C0!important;color:#fff!important;}#mermaid-svg-TMv8IVnMv9gpWJTH .use tspan{fill:#fff!important;}#mermaid-svg-TMv8IVnMv9gpWJTH .avoid>*{fill:#FF5252!important;stroke:#C62828!important;color:#fff!important;}#mermaid-svg-TMv8IVnMv9gpWJTH .avoid span{fill:#FF5252!important;stroke:#C62828!important;color:#fff!important;}#mermaid-svg-TMv8IVnMv9gpWJTH .avoid tspan{fill:#fff!important;}#mermaid-svg-TMv8IVnMv9gpWJTH .opt>*{fill:#66BB6A!important;stroke:#2E7D32!important;color:#fff!important;}#mermaid-svg-TMv8IVnMv9gpWJTH .opt span{fill:#66BB6A!important;stroke:#2E7D32!important;color:#fff!important;}#mermaid-svg-TMv8IVnMv9gpWJTH .opt tspan{fill:#fff!important;}#mermaid-svg-TMv8IVnMv9gpWJTH .tool>*{fill:#FFA726!important;stroke:#E65100!important;color:#fff!important;}#mermaid-svg-TMv8IVnMv9gpWJTH .tool span{fill:#FFA726!important;stroke:#E65100!important;color:#fff!important;}#mermaid-svg-TMv8IVnMv9gpWJTH .tool tspan{fill:#fff!important;} 基础
避坑
优化
顺序
进阶
实战
聚簇 vs 非聚簇
(结构)
索引语法 CRUD
(会用)
失效 10 大场景
(避坑)
覆盖索引
(提速)
最左前缀
(顺序)
索引下推 ICP
(优化)
EXPLAIN 实战
(终极武器)
十、5 个常见踩坑
| # | 踩坑 | 现象 | 解法 |
|---|---|---|---|
| 1 | UUID 做主键 | B+Tree 频繁分裂,插入慢 | 用自增 BIGINT |
| 2 | SELECT * |
几乎必然回表 | 只查需要的字段 |
| 3 | WHERE 上做函数 |
YEAR(create_time)=2024 失效 |
改 BETWEEN |
| 4 | 联合索引顺序错 | 高频字段不在最左 | 重新建索引 |
| 5 | 小表也建索引 | 优化器主动放弃,浪费空间 | 小表不用建 |
十一、6 步索引优化路径
#mermaid-svg-DEPDyNAgIYiL1RrS{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DEPDyNAgIYiL1RrS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DEPDyNAgIYiL1RrS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DEPDyNAgIYiL1RrS .error-icon{fill:#552222;}#mermaid-svg-DEPDyNAgIYiL1RrS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DEPDyNAgIYiL1RrS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DEPDyNAgIYiL1RrS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DEPDyNAgIYiL1RrS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DEPDyNAgIYiL1RrS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DEPDyNAgIYiL1RrS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DEPDyNAgIYiL1RrS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DEPDyNAgIYiL1RrS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DEPDyNAgIYiL1RrS .marker.cross{stroke:#333333;}#mermaid-svg-DEPDyNAgIYiL1RrS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DEPDyNAgIYiL1RrS p{margin:0;}#mermaid-svg-DEPDyNAgIYiL1RrS .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DEPDyNAgIYiL1RrS .cluster-label text{fill:#333;}#mermaid-svg-DEPDyNAgIYiL1RrS .cluster-label span{color:#333;}#mermaid-svg-DEPDyNAgIYiL1RrS .cluster-label span p{background-color:transparent;}#mermaid-svg-DEPDyNAgIYiL1RrS .label text,#mermaid-svg-DEPDyNAgIYiL1RrS span{fill:#333;color:#333;}#mermaid-svg-DEPDyNAgIYiL1RrS .node rect,#mermaid-svg-DEPDyNAgIYiL1RrS .node circle,#mermaid-svg-DEPDyNAgIYiL1RrS .node ellipse,#mermaid-svg-DEPDyNAgIYiL1RrS .node polygon,#mermaid-svg-DEPDyNAgIYiL1RrS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DEPDyNAgIYiL1RrS .rough-node .label text,#mermaid-svg-DEPDyNAgIYiL1RrS .node .label text,#mermaid-svg-DEPDyNAgIYiL1RrS .image-shape .label,#mermaid-svg-DEPDyNAgIYiL1RrS .icon-shape .label{text-anchor:middle;}#mermaid-svg-DEPDyNAgIYiL1RrS .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DEPDyNAgIYiL1RrS .rough-node .label,#mermaid-svg-DEPDyNAgIYiL1RrS .node .label,#mermaid-svg-DEPDyNAgIYiL1RrS .image-shape .label,#mermaid-svg-DEPDyNAgIYiL1RrS .icon-shape .label{text-align:center;}#mermaid-svg-DEPDyNAgIYiL1RrS .node.clickable{cursor:pointer;}#mermaid-svg-DEPDyNAgIYiL1RrS .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DEPDyNAgIYiL1RrS .arrowheadPath{fill:#333333;}#mermaid-svg-DEPDyNAgIYiL1RrS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DEPDyNAgIYiL1RrS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DEPDyNAgIYiL1RrS .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DEPDyNAgIYiL1RrS .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DEPDyNAgIYiL1RrS .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DEPDyNAgIYiL1RrS .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DEPDyNAgIYiL1RrS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DEPDyNAgIYiL1RrS .cluster text{fill:#333;}#mermaid-svg-DEPDyNAgIYiL1RrS .cluster span{color:#333;}#mermaid-svg-DEPDyNAgIYiL1RrS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DEPDyNAgIYiL1RrS .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DEPDyNAgIYiL1RrS rect.text{fill:none;stroke-width:0;}#mermaid-svg-DEPDyNAgIYiL1RrS .icon-shape,#mermaid-svg-DEPDyNAgIYiL1RrS .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DEPDyNAgIYiL1RrS .icon-shape p,#mermaid-svg-DEPDyNAgIYiL1RrS .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DEPDyNAgIYiL1RrS .icon-shape .label rect,#mermaid-svg-DEPDyNAgIYiL1RrS .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DEPDyNAgIYiL1RrS .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DEPDyNAgIYiL1RrS .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DEPDyNAgIYiL1RrS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-DEPDyNAgIYiL1RrS .step>*{fill:#F3E5F5!important;stroke:#9013FE!important;color:#333!important;}#mermaid-svg-DEPDyNAgIYiL1RrS .step span{fill:#F3E5F5!important;stroke:#9013FE!important;color:#333!important;}#mermaid-svg-DEPDyNAgIYiL1RrS .step tspan{fill:#333!important;} 第 1 步
查 slow log
找慢 SQL
第 2 步
EXPLAIN
看 type/key/rows
第 3 步
建合适索引
(高频/等值/范围)
第 4 步
避免失效
(函数/类型/左模糊)
第 5 步
覆盖索引
(不回表)
第 6 步
回归 EXPLAIN
对比前后
- 第 1 步:查 slow log 找慢 SQL
- 第 2 步:EXPLAIN 看 type / key / rows
- 第 3 步:建合适索引(高频 / 等值 / 范围顺序)
- 第 4 步:避免失效(不用函数 / 不做类型转换 / 不左模糊)
- 第 5 步:覆盖索引(不回表)
- 第 6 步:回归 EXPLAIN 对比前后
十二、推荐阅读
如果你想深入学 MySQL 索引,这几本 / 这些资料值得读:
- 📚 《高性能 MySQL》(Baron Schwartz 等)------ MySQL 性能圣经
- 📚 《MySQL 是怎样运行的》(小孩子 4919)------ 国产神书,从根上理解 MySQL
- 📖 MySQL 官方文档(dev.mysql.com)------ 永远的第一手资料
- 📖 EXPLAIN 官方文档------ 字段权威解释
- 🔗 极客时间《MySQL 实战 45 讲》(林晓斌)------ 阿里专家讲解
十三、附录:一句话总结各核心
| 核心 | 一句话 |
|---|---|
| 聚簇索引 | InnoDB 数据 = 主键 = 聚簇索引,选对主键成功一半 |
| 索引语法 | 建索引 1 行 SQL 容易,用对索引才是真功夫 |
| 失效 10 大场景 | 索引失效 90% 是"用错"------最左前缀、类型转换、函数运算 |
| 覆盖索引 | 不加机器、不改代码,就快一倍 |
| 最左前缀 | 联合索引的顺序是性能的关键------顺序不对,索引等于白建 |
| 索引下推 | MySQL 优化器的"自动挡"------默认开启,帮你省回表 |
| EXPLAIN 调优 | EXPLAIN 是慢 SQL 的 X 光机------不会看,调优就是盲改 |