MySQL索引最左原则:从原理到实战的深度解析
MySQL索引最左原则:从原理到实战的深度解析
一、什么是索引最左原则?
索引最左原则是MySQL复合索引使用的核心规则,简单来说:
"当使用复合索引(多列索引)时,查询条件必须从索引的最左列开始,且不能跳过中间的列,否则索引将无法完全生效"
为什么会有这个原则?
这与B+树索引的存储结构密切相关:
- 复合索引按照定义时的列顺序构建
- 数据先按第一列排序
- 第一列相同的情况下按第二列排序
- 依此类推形成层级结构
二、3种典型场景分析
场景1:完美匹配索引顺序
-- 创建索引
CREATE INDEX idx_user ON users(country, city, age);
-- 有效查询
SELECT * FROM users
WHERE country='China'
AND city='Beijing'
AND age=30;
索引使用情况:同时使用三列进行精确查找,走全索引扫描
场景2:缺少最左列
-- 无效查询
SELECT * FROM users
WHERE city='Shanghai'
AND age=25;
索引失效原因:没有最左列country,无法利用索引的排序结构
场景3:中间断档查询
-- 部分有效查询
SELECT * FROM users
WHERE country='USA'
AND age=28;
️ 索引使用情况:仅使用country列进行索引查找,age列无法参与索引过滤
三、5大实战案例分析
案例1:范围查询后的列失效
SELECT * FROM users
WHERE country='Japan'
AND city > 'Osaka'
AND age=35;
索引使用:仅使用到country和city列,age列无法走索引过滤
案例2:LIKE模糊查询
-- 有效情况
SELECT * FROM users
WHERE country='China'
AND city LIKE 'Bei%';
-- 失效情况
SELECT * FROM users
WHERE city LIKE '%hai';
规律总结:只有最左前缀的LIKE查询能使用索引
案例3:覆盖索引特例
-- 查询字段全在索引中
SELECT country, city, age
FROM users
WHERE city='Guangzhou';
特殊机制:虽然不符合最左原则,但通过索引扫描(Index Scan)而非索引查找(Index Seek)完成查询
案例4:排序优化
-- 有效排序
SELECT * FROM users
ORDER BY country, city, age;
-- 失效排序
SELECT * FROM users
ORDER BY city, age;
排序规则:ORDER BY子句同样需要遵循最左原则
案例5:索引跳跃扫描(MySQL 8.0+)
-- MySQL 8.0新特性
SELECT * FROM users
WHERE city='Paris'
AND age=30;
优化机制:通过Index Skip Scan技术突破传统限制,但需要满足:
- 前导列不同值较少
- 优化器认为扫描成本更低
四、最佳实践指南
- 索引设计原则
- 将高区分度的列放在左侧
- 频繁组合查询的列优先
- 避免创建超过3列的复合索引
- 查询优化技巧
-- 反模式
SELECT * FROM table WHERE col2=1 AND col3=2;
-- 优化方案
ALTER TABLE table ADD INDEX idx_col1_col2_col3(col1, col2, col3);
SELECT * FROM table WHERE col1=1 AND col2=1 AND col3=2;
索引分析工具 使用EXPLAIN查看索引使用情况:
EXPLAIN SELECT * FROM users WHERE country='China' AND age=25;
五、常见误区解析
误区1:所有列单独建索引更好
CREATE INDEX idx_country ON users(country);
CREATE INDEX idx_city ON users(city);
CREATE INDEX idx_age ON users(age);
错误认知:
正确做法:分析实际查询模式,建立合适的复合索引
误区2:索引顺序无关紧要
CREATE INDEX idx_city_country ON users(city, country);
错误示例:
正确理解:索引顺序直接影响查询效率,需按查询条件频率排序
误区3:所有查询都能走索引
SELECT * FROM users WHERE city LIKE '%York%';
错误期待:
现实情况:非最左前缀的LIKE查询无法使用索引
六、工具推荐
dblens索引分析工具 提供:
- 可视化索引使用分析
- AI索引设计分析
- 智能索引优化建议
终极口诀:
复合索引像电话,国家城市区号不能差
最左原则要记牢,跳过中间就抓瞎
范围查询是杀手,排序分组也看它
新版优化虽强大,基础规则不能垮
MySQL索引最左原则:从原理到实战的深度解析的更多相关文章
- mysql 索引最左原则原理
索引本质是一棵B+Tree,联合索引(col1, col2,col3)也是. 其非叶子节点存储的是第一个关键字的索引,而叶节点存储的则是三个关键字col1.col2.col3三个关键字的数据,且按照c ...
- MySQL索引最左原则
通过实例理解单列索引.多列索引以及最左前缀原则 实例:现在我们想查出满足以下条件的用户id: 因为我们不想扫描整表,故考虑用索引. 单列索引: ALTER TABLE people ADD INDEX ...
- Mysql索引最左匹配原则
先来看个例子: 1. 示例1:假设有如下的一张表: DROP TABLE IF EXISTS testTable; CREATE TABLE testTable ( ID BIGINT NOT NUL ...
- MySQL索引之数据结构及算法原理
MySQL索引之数据结构及算法原理 MySQL支持多个存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.本文只关注BTre ...
- 并发编程(十五)——定时器 ScheduledThreadPoolExecutor 实现原理与源码深度解析
在上一篇线程池的文章<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中从ThreadPoolExecutor源码分析了其运行机制.限于篇幅,留下了Scheduled ...
- 并发编程(十二)—— Java 线程池 实现原理与源码深度解析 之 submit 方法 (二)
在上一篇<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法.这篇文章是接着上一篇文章 ...
- 【转】mysql索引最左匹配原则的理解
作者:沈杰 链接:https://www.zhihu.com/question/36996520/answer/93256153 来源:知乎 CREATE TABLE `student` ( `id` ...
- mysql索引最左匹配原则的理解
CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `ci ...
- 【转】Mysql索引最左匹配原则理解
作者:沈杰 链接:https://www.zhihu.com/question/36996520/answer/93256153来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- MySQL索引背后的数据结构及原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
随机推荐
- 强化学习算法中的log_det_jacobian
相关: https://colab.research.google.com/github/google/brax/blob/main/notebooks/training_torch.ipynb 之前 ...
- 使用JSch进行sftp的连接运行状况检查
public boolean checkConnection() throws JSchException { try { JSch jsch = new JSch(); Session sessio ...
- P10936 导弹防御塔 题解
题目链接 题目大意 城堡有 m 个敌人.n 个能发射导弹的防御塔.导弹的速度固定,都为 v.导弹需要 T1 秒发射,T2 分钟冷却,还需要防御塔到敌人距离的 dis/v 的时间.给定防御塔和敌人的坐标 ...
- 快速生成视频互动直播包含会议直播APP(Android)
阿里云服务器推荐购买99元 首先此应用基于腾讯云实时音视频TRTC.注册腾讯云https://console.cloud.tencent.com/trtc 并完成实名认证开始. 安卓直播高级版 包括直 ...
- Qt开源作品15-视频监控画面
一.前言 视频监控系统在整个安防领域,已经做到了烂大街的程序,全国起码几百家公司做过类似的系统,当然这一方面的需求量也是非常旺盛的,各种定制化的需求越来越多,尤其是这几年借着人脸识别的东风,发展更加迅 ...
- [转]OpenCV学习笔记(十五)——摄像机的标定和3D重建calib3D
OpenCV学习笔记(十五)--摄像机的标定和3D重建calib3D OpenCV学习笔记(16)双目测距与三维重建的OpenCV实现问题集锦(一)图像获取与单目定标 翻译 搜索 复制
- .Net程序员机会来了,微软官方新推出一个面向Windows开发者本地运行AI模型的开源工具
想要开发AI产品的.Net程序员机会来了,这个项目应该好好研究. 虽然说大模型基本都有提供网络API,但肯定没有直接使用本地模型速度快. 最近微软官方新推出AI Dev Gallery开源项目,可以帮 ...
- ESP8266 wifi模块+CH340烧录板安装使用运行教程
硬件准备 ESP8266-01S 模块 USB转TTL烧录板(CH340) LED灯(建议使用3.3V LED) 220Ω电阻(LED限流) 面包板和跳线若干 我的是这样的不用接线,其他的参考 ESP ...
- Solution -「CTSC 2017」「洛谷 P3772」游戏
\(\mathscr{Description}\) 有 \(n\) 个随机真值 \(x_{1..n}\), 已知 \(P(x_1=1)=p_1\), 对于 \(2\le i\le n\), \(P ...
- Eval-Expression.NET:动态执行C#脚本,类似Javascript的Eval函数功能
我们都知道在JavaScript中,我们可以通过Eval来执行JavaScript字符串代码. 下面推荐一个.Net版本的Eval的开源项目. 01 项目简介 Eval-Expression.NET是 ...