首页 > 数据库 >MySQL 索引最左前缀原则失效?

MySQL 索引最左前缀原则失效?

时间:2022-11-16 19:12:51浏览次数:64  
标签:username NULL 前缀 DEFAULT sex 索引 MySQL password

测试索引最左前缀原则,发现缺失带头索引后,索引还是生效的。

一、测试

  1. 创建测试表
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `username` varchar(50) NOT NULL DEFAULT '' COMMENT '用户名',
  `password` varchar(100) NOT NULL DEFAULT '' COMMENT '密码',
  `sex` tinyint(2) NOT NULL DEFAULT '0' COMMENT '性别',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
  1. 给username、password、sex三个字段创建联合索引:
ALTER TABLE `user` ADD INDEX idx(username,`password`, sex);
  1. EXPLAIN 查看WHERE password='123456' AND sex=1执行计划:
EXPLAIN SELECT * FROM `user` WHERE `password`='123456' AND `sex`=1

二、分析

结果显示,username、password、sex联合索引并没有失效,到这里以为索引最左前缀原则失效了,但其实并没有。

查询资料后发现,该SQL执行计划type=index,即索引全表扫描,也就是只遍历了索引树:

在这个例子中,查询where条件是password和sex,select * 实际上是id、username、password、sex,idx索引中包含了username、password、sex,关联了主键索引的索引键,这时候是不需要回表查询的,可以直接返回结果。

三、验证

猜测如果新增一个字段,而联合索引没有包含,则应该走全表扫描:

验证一下

  1. 新增age属性
ALTER TABLE `user` ADD COLUMN `age` INT(10) DEFAULT 0 NOT NULL AFTER `sex`; 
  1. 再执行一下EXPLAIN 查看WHERE password='123456' AND sex=1执行计划:
EXPLAIN SELECT * FROM `user` WHERE `password`='123456' AND `sex`=1

  1. 执行结果可以看到,type=ALL,走的是全表扫描。

到这里,可以看到联合索引的最左前缀原则并没有失效。

在MySQL 8.0开始,加入了新的优化机制,新增了Index Skip Scan索引跳跃式扫描,对于这种SQL,联合索引也能生效使用

标签:username,NULL,前缀,DEFAULT,sex,索引,MySQL,password
From: https://www.cnblogs.com/lveyHang/p/16897184.html

相关文章

  • MySQL索引和SQL调优手册
    MySQL索引MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTre......
  • mysql学习(9):联合索引和多个单列索引的使用区别详解
    前言为了提高数据库的查询效率,建索引是最常用的手段。那么问题来了,如果查询条件为2个及以上,我们是创建多个单列索引好呢,还是建一个联合索引比较好?正文我们首先来建一张表,......
  • 查看MySQL数据库所有的表名、表注释、字段名称、类型、长度、备注,一键导出生成数据库
    一、先了解下INFORMATION_SCHEMA1、在MySQL中,把INFORMATION_SCHEMA看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据......
  • MySQL清空表提示Cannot truncate a table referenced in a foreign key constraint
    MySQL清空表提示Cannottruncateatablereferencedinaforeignkeyconstraint在MySQL执行truncatetablexxx时,出现了这个报错[Err]1701-Cannottruncateatable......
  • 彻底把 MySQL的锁搞懂
       最近,同事在生产上遇到一个MySQL死锁的问题,于是在帮忙解决问题后,特意花了一周的时间,把MySQL所有的锁都整理了一遍,今天就来一起聊聊MySQL锁。申明:本文基于M......
  • Pycharm“索引中”问题
    问题描述在Pycharm编辑器中进行训练模型时,如果导入包含数据集的项目后,后台便会有持续性任务进行中,称作是“索引中”。问题原因正是由于项目中数据集的存在,比如某个文件......
  • python 3.6下 安装mysqlclient
    倒腾了大半天,终于把mysqlclient安装成功,赶紧把步骤进行梳理并记录1、python安装好以后,首先要看一下自己的python是32还是64位的,这关系到你下载的mysqlclient。查看方法:......
  • Counting Rectangles(二维数组前缀和)
    题目链接题目描述:Youhave\(n\)rectangles,the\(i\)-threctanglehasheight\(h_i\)andwidth\(w_i\).Youareasked\(q\)queriesoftheform\(h_sw_sh_b......
  • MYSQL5.7 保姆级安装教程
    现在要是说mysql是什么东西,就不礼貌了虽然有的同学没有进行系统的深入学习,但应该也有个基本概念【不了解也没关系,后续会进行mysql专栏讲解】简单来说,存储数据的学习mysq......
  • 2-MySQL面试题
    数据库基础知识为什么要使用数据库数据保存在内存优点:存取速度快缺点:数据不能永久保存数据保存在文件优点:数据永久保存缺点:1)速度比内存操作慢,频繁的IO操作。2)查......