前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入理解联合索引的最左前缀原则

深入理解联合索引的最左前缀原则

作者头像
西柚dzh
发布2022-06-09 17:31:24
7570
发布2022-06-09 17:31:24
举报
文章被收录于专栏:dcmickey小站dcmickey小站

前言

实践是检验知识的唯一标准!

联合索引

准备环境

代码语言:javascript
复制
CREATE TABLE `abc_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `aid` varchar(20) NOT NULL DEFAULT '' COMMENT 'aid',
  `bid` varchar(20) NOT NULL DEFAULT '' COMMENT 'bid',
  `cid` varchar(20) NOT NULL DEFAULT '' COMMENT 'cid',
  PRIMARY KEY (`id`),
  KEY `abc` (`aid`,`bid`,`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- truncate table abc_table
INSERT INTO abc_table (aid,bid,cid) VALUES('a01','b01','c01');
INSERT INTO abc_table (aid,bid,cid) VALUES('a02','b02','c02');
INSERT INTO abc_table (aid,bid,cid) VALUES('a03','b03','c03');

开始测试

代码语言:javascript
复制
--组合结果为 abc ab ac bc 四种组合结果

--1.abc 能用到索引 ,bca  cab 都可以索引,因为mysql有查询优化器
explain select * from abc_table where aid='a01' and bid='b01' and cid='c01';
--bca能用到索引
explain select * from abc_table where bid='b01' and cid='c01'and aid='a01';
--cab能用到索引
explain select * from abc_table where  cid='c01'and aid='a01' and bid='b01';

-- 部分值匹配时,只要条件中有最左索引项就会用到索引
-- ab 能用到索引,两个
explain select * from abc_table where aid='a01' and bid='b01';
-- ac 能用到索引, 一个, 只能依靠a来索引
explain select * from abc_table where aid='a01'  and cid='c01';

--ba 能用到索引,两个
explain select * from abc_table where bid='b01'  and aid='a01';
--ca 能用到索引 一个, 只能依靠a来索引
explain select * from abc_table where cid='c01' and aid='a01';

-- 条件中没有最左索引,不会用到索引,全表扫描
--bc 不能用到索引
explain select * from abc_table where bid='b01' and cid='c01';

--b 用不到索引
explain select * from abc_table where bid='b01';

--c 用不到索引
explain select * from abc_table where cid='c01';

--cb 用不到索引
explain select * from abc_table where cid='c01' and bid='b01';

结论

  1. 联合索引abc,b+树会按照先a再b再c的优先级进行排序
  2. 遵循最左前缀原则,所以a必须要参与where条件,任意组合都可以。因为mysql有优化器可以优化顺序
  3. 如果是ac则只会走a的索引,不会走c的索引。但是还是走索引的!!!!
  4. 当只有bc或者只有b、c的时候,不会触发索引。不满足最左前缀原则

索引失效情况总结

  • !=、<> 会索引导致失效,走全表扫描
  • or连接条件,当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效
  • like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。
  • 组合索引,不是使用第一列索引,索引失效。
  • 数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。
  • 在索引列上使用 IS NULL 或 IS NOT NULL操作。索引是不索引空值的,所以这样的操作不能使用索引
  • 对索引字段进行计算操作、字段上使用函数

版权属于:dingzhenhua

本文链接:https://cloud.tencent.com/developer/article/2019357

转载时须注明出处及本声明

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-04-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 联合索引
    • 结论
    • 索引失效情况总结
    相关产品与服务
    云数据库 MySQL
    腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档