MySQL 复合索引测试

对MySQL复合索引结合具体示例,各条件下索引使用情况的运行结果及分析。 

目录

复合索引示例

创建表

新增数据

查询数据

选项A

SQL查询

explain分析

选项B

SQL查询

explain分析

选项C

SQL查询

explain分析

选项D

SQL查询

explain分析

选项E

SQL查询

explain分析

总结


 

复合索引示例

假设某个表有一个联合索引(c1,c2,c3,c4)。

A where c1 = ? and c2 = ? and c4 > ? and c3 = ?

B where c1 = ? and c2 = ? and c4 = ? order by c3

C where c1 = ? and c4 = ? group by c3, c2

D where c1 = ? and c5 = ? order by c2, c3

E where c1 = ? and c2 = ? and c5=? order by c2, c3

有谁知道下面A-E能否可以使用索引!!为什么?

创建表

创建一个表,表引擎为MYISAM,并设置包含四个列的复合索引。

SQL语句如下:

CREATE TABLE `fuhe` (`id` int(11) NOT NULL AUTO_INCREMENT,`c1` char(1) DEFAULT '',`c2` char(1) DEFAULT '',`c3` char(1) DEFAULT '',`c4` char(1) DEFAULT '',`c5` char(1) DEFAULT '',PRIMARY KEY (`id`),KEY `c1` (`c1`,`c2`,`c3`,`c4`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

新增数据

在上述表中新增部分数据,语句如下:

INSERT INTO `test`.`fuhe` (`id`, `c1`, `c2`, `c3`, `c4`, `c5`) VALUES ('1', 'a', 'b', 'c', 'd', 'e');
INSERT INTO `test`.`fuhe` (`id`, `c1`, `c2`, `c3`, `c4`, `c5`) VALUES ('2', 'A', 'b', 'c', 'd', 'e');
INSERT INTO `test`.`fuhe` (`id`, `c1`, `c2`, `c3`, `c4`, `c5`) VALUES ('3', 'a', 'B', 'c', 'd', 'e');

查询数据

选项A

SQL查询

where c1 = ? and c2 = ? and c4 > ? and c3 = ?

# where c1 = ? and c2 = ? and c4 > ? and c3 = ?
SELECT * FROM `fuhe` where c1 = 'a' and c2 = 'b' and c4 > 'a' and c3 = 'c';

运行结果:

explain分析
explain SELECT * FROM `fuhe` where c1 = 'a' and c2 = 'b' and c4 > 'a' and c3 = 'c';

运行结果:

说明:

通过key_len属性12可知,utf8每个索引长度为3,使用了4列的索引;故复合索引的c1 c2 c3 c4列索引都使用上了。因为c4是范围查找,所以type类型为range。

选项B

SQL查询

where c1 = ? and c2 = ? and c4 = ? order by c3

# where c1 = ? and c2 = ? and c4 = ? order by c3
SELECT * FROM `fuhe` where c1 = 'a' and c2 = 'b' and c4 = 'd' order by c3;

 运行结果:

explain分析
explain SELECT * FROM `fuhe` where c1 = 'a' and c2 = 'b' and c4 = 'd' order by c3;

运行结果:

说明:

使用了复合索引的c1 c2列,c3列只是参与了排序。如果c3列没有索引就会进行文件排序。

选项C

SQL查询

where c1 = ? and c4 = ? group by c3, c2

# where c1 = ? and c4 = ? group by c3, c2
SELECT * FROM `fuhe` where c1 = 'a' and c4 = 'd' group by c3, c2;

运行结果:

explain分析
explain SELECT * FROM `fuhe` where c1 = 'a' and c4 = 'd' group by c3, c2;

运行结果:

说明:

只使用了复合索引的c1列,而且由于group by并不是按照索引顺序进行分组的,导致使用了临时表和文件排序。

选项D

SQL查询

where c1 = ? and c5 = ? order by c2, c3

# where c1 = ? and c5 = ? order by c2, c3
SELECT * FROM `fuhe` where c1 = 'a' and c5 = 'e' order by c2, c3;

运行结果:

explain分析
explain SELECT * FROM `fuhe` where c1 = 'a' and c5 = 'e' order by c2, c3;

运行结果:

说明:

通过索引长度判断,只使用到了复合索引的第一列c1,c2 c3列参与了排序,因为c5列未创建索引故using where。

选项E

SQL查询

 where c1 = ? and c2 = ? and c5=? order by c2, c3

# where c1 = ? and c2 = ? and c5=? order by c2, c3
SELECT * FROM `fuhe` where c1 = 'a' and c2 = 'b' and c5 = 'e' order by c2, c3;

运行结果:

explain分析

explain SELECT * FROM `fuhe` where c1 = 'a' and c2 = 'b' and c5 = 'e' order by c2, c3;

运行结果:

说明:

使用了复合索引的前两列,因为是按照索引顺序进行排序的,c2 c3列参与了排序,最后的c5没有创建索引,故使用了where条件,其他都是在索引树上扫描的。

总结

对MySQL复合索引结合具体示例,各条件下索引使用情况的运行结果及分析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/460423.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaFx -- chapter05(多用户服务器)

chapter05(线程池-多用户服务器) 教学与实践目的 学会服务器支持多用户并发访问的程序设计技术。 多用户服务器是指服务器能同时支持多个用户并发访问服务器所提供的服务资源,如聊天服务、文件传输等。 第二讲的TCPServer是单用户版本,每次只能和一个…

初体验鸿蒙 HarmonyOS NEXT开发

上个星期三就下载了鸿蒙 HarmonyOS NEXT,安装好了后测试了一下,感觉界面和功能设计与IntelliJ IDEA很像,对初学者非常友好,所见即所得。不知道什么原因,写了代码后测试起来很慢,简单测试后就没有再动。 今天…

《DIY项目之“一只眼狗链”》:视频方案

项目背景 《DIY项目之“一只眼狗链”》合集主要记录完成一个DIY项目的所有过程。该合集预计更新频率为2~3周一篇(同样属于一边做一边记录发布,时间上主要涉及PCB绘板、零部件采购、样品制作、编程等,存在一定的不可控性)。 当前项…

Date工具类详细汇总-Date日期相关方法

# 1024程序员节 | 征文 # 目录 简介 Date工具类单元测试 Date工具类 简介 本文章是个人总结实际工作中常用到的Date工具类,主要包含Java-jdk8以下版本的Date相关使用方法,可以方便的在工作中灵活的应用,在个人工作期间频繁使用这些时间的格…

WPF拖拽交互全攻略及实现自定义拖拽控件及数据交换技巧解析

目录 1. 基本概念2 . 实现拖拽功能概述需要要实现基本的拖放,完成以下任务:其他操作 示例3.1 设置拖拽源,拖拽开始3.2 设置拖拽效果DragDropEffects 3.3 设置放置目标,处理拖拽数据拖拽输入DragEnter事件DragOver事件拖拽离开Drag…

ubuntu 22.04网线连接无ip、网络设置无有线网界面(netplan修复)

目前遇到过树莓派和其他设备安装 ubuntu22.04, 使用有线网络一段时间(可能有其他软件安装导致)造成有线网络未启动无ip分配的问题。 1、动态分配 通过命令行启动dhcpclient实现 网络eth0存在异常,网口灯电源和信号灯均点亮&am…

开关灯问题(c语言)

样例&#xff1a;10 10 &#xff0c;输出&#xff1a;1&#xff0c;4&#xff0c;9 5 5 &#xff0c;输出&#xff1a;1&#xff0c;4 代码如下 #include<stdio.h> //引入bool值的概念 #include<stdbool.h> int main() {int n 0;//n为灯的数量int m 0;…

【Android14 ShellTransitions】(八)播放动画

书接上回&#xff0c;话说当WMCore部分走到了Transition.onTransactionReady&#xff0c;计算完参与动画的目标&#xff0c;构建出TransitionInfo后&#xff0c;接下来就把这个包含了动画参与者的TransitionInfo发给了WMShell&#xff0c;然后就该播放动画了&#xff0c;这部分…

git快速合并代码dev->master

需求&#xff1a; 日常开发都是在dev分支进行开发&#xff0c;但是dev代码开发测试完成后&#xff0c;需要将dev代码合到master主分支上 开始合并代码&#xff1a; 一、场景 一个代码仓库&#xff0c;包含两个分支&#xff0c;一个是master&#xff0c;另一个是dev&#xff1b…

gitblit 学习-hook功能

hook功能 hook是什么 git hooks是git提供的&#xff0c;在发生特定事件时&#xff0c;允许用户添加自定义代码&#xff08;或操作&#xff09;的方式。 就像Vue中组件的生命周期钩子&#xff0c;比如&#xff0c;你想在vue组件创建后输出一行log, 你可能会这么写 有什么用&a…

Android Input的流程和原理

Android Input事件机制 Android系统是由事件驱动的&#xff0c;而Input是最常见的事件之一&#xff0c;用户的点击、滑动、长按等操作&#xff0c;都属于Input事件驱动&#xff0c;其中的核心就是InputReader和InputDispatcher。InputReader和InputDispatcher是跑在system_serv…

Jmeter基础篇(19)JSR223预处理器

前言 JSR223预处理器是Apache JMeter中的一个组件&#xff0c;它允许用户使用任何支持Java Scripting API (JSR 223) 的脚本语言来执行预处理任务。这个功能非常强大&#xff0c;因为它让测试人员能够利用如Groovy、JavaScript&#xff08;Nashorn引擎&#xff09;、BeanShell…

轻松实现金蝶与旺店通数据无缝对接的完整解决方案

【金蝶】采购入库单对接【旺店通】委外入库单_合并 在企业信息化系统中&#xff0c;数据的高效流转和准确对接是确保业务顺畅运行的关键。本文将分享一个实际案例&#xff0c;展示如何通过轻易云数据集成平台实现金蝶云星空与旺店通企业奇门之间的数据无缝对接。具体方案为&am…

基于SpringBoot的汽车票网上预订系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

前端好用的网站分享——CSS(持续更新中)

1.CSS Scan 点击进入CSS Scan CSS盒子阴影大全 2.渐变背景 点击进入color.oulu 3.CSS简化压缩 点击进入toptal 4.CSS可视化 点击进入CSS可视化 这个强推&#xff0c;话不多说&#xff0c;看图! 5.Marko 点击进入Marko 有很多按钮样式 6.getwaves 点击进入getwaves 生…

【K8S系列】Kubernetes 中 Service IP 分配 问题及解决方案【已解决】

在 Kubernetes 中&#xff0c;LoadBalancer 类型的 Service 允许用户轻松地将应用暴露给外部流量。它自动创建一个云负载均衡器并分配一个外部 IP 地址。然而&#xff0c;在某些情况下&#xff0c;LoadBalancer 类型的 Service 可能未能成功分配 IP 地址&#xff0c;导致外部无…

Tomcat servlet response关于中文乱码的经验

前言 最近修改老项目项目&#xff0c;使用zuul网关返回的中文内容乱码了&#xff0c;如果使用GBK或者GB2312编码确正常显示&#xff0c;稍微实验了一下&#xff0c;发现里面很多细节&#xff0c;毕竟Springboot对我们做了很多事情&#xff0c;而且当我们使用不同的模式会出现很…

微服务之间调用,OpenFeign传递用户(RequestInterceptor接口)

场景&#xff1a;微服务之黑马商城项目-登录拦截器在网关完成用户的校验&#xff0c;并将用户信息&#xff08;用户id&#xff09;存入请求头&#xff0c;假设将购物车里面的商品进行结算就会生成订单并清空购物车&#xff0c;这里涉及到了交易服务模块远程调用购物车模块&…

Java中String的length与Oracle数据库中VARCHAR2实际存储长度不一致的问题

目录 一、根本原因 二、解决方案 一、根本原因 Oracle数据库新增数据的时候报如下错误&#xff1a; 先给大家看个小案例&#xff0c;这样更好去理解&#xff0c;下面是一段测试代码&#xff1a; 这里面我分别列举了三种字符串&#xff0c;中文&#xff0c;英文和数字以及两种…

探索 CrewAI:引领多智能体协作的未来

探索 CrewAI&#xff1a;引领多智能体协作的未来 在人工智能领域&#xff0c;如何让多个智能体协同工作以解决复杂问题一直是一个热门话题。CrewAI 作为一个前沿的框架&#xff0c;正是为了解决这一挑战而生。它通过角色扮演和自主智能体的协作&#xff0c;赋予了智能体无缝合…