mysql 索引优化 explain,复合索引,联合索引,优化 user_base 和 log_login 实战


本节是关于MySQL的复合索引相关的知识,两个或更多个列上的索引被称作复合索引,本文主要介绍了mysql 联合索引生效的条件及失效的条件
对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c)。 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找;
复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。

可见 登录和注册时判断一个用户名是否存在都使用了 user_name + client_type 这2列,且要求用户名 + 终端类型 必须唯一,若只单独给这2列加一个唯一索引,则登录时 又查询了 user_pwd 所以,最好这3列一并组成一个唯一索引,才能发挥最佳效率,以下我们测试一下:
1. 首先只user_name + client_type 组成唯一索引,若登录的话看下查询效能:



explain SELECT * from user_base where user_name = 'diandaxia' and client_type = 2 and user_pwd = 'F6E932F3C956ECA5E2133808847F6A4B';
explain SELECT * from user_base where user_name = 'diandaxia' and client_type = 2 /* 1. 仅仅 user_name + client_type 组成唯一索引的情况下:
可以看到登录和注册的效能 filtered 竟然是 100% ,就是说没有必要把user_pwd也加进索引里去,
原因可能是因为 user_name + client_type 不是普通的索引,而是唯一的索引,根据唯一索引就直接
定位到了 b+ 树的叶子节点,所以没有必要再去按user_pwd 来进行筛选了,所以导致了 效能100% */
2. 根据上面的分析,接下来这样搞下,把user_name + client_type 搞成 非 唯一索引。再来测试一下效能:



所以,user_base 表中,只需要 user_name + client_type 组成唯一索引就行了,没有必要把 user_pwd 也加进索引中,浪费索引空间。这点对我以后用户表的开发设计,非常重要的思想,即只要是用户表 通常就是
1. 若没有client_type项的话,user_id 主键 、user_name 唯一索引;
2. 若有 client_type 字段的话,则是 user_id 主键、user_name + client_type 唯一索引就可 保证登录 + 注册时判断用户是否存在 最优化。
好了,接下来 开始优化一下 log_login 表的索引,因为这个表也是常用的表;

可以看到,这2个查询 都用到了 user_name + client_type + hard_env_id + login_flag 所以 这 4列 应该是可以确定的需要组成一个索引,没有必要是唯一索引,因为业务上 这个不唯一。
那么 login_time 呢,这个需要也加索引吗,接下来就用 explain 来测试 对比下 效能
1. 仅那4列 有索引



2. 接下来就是给把login_time 也加进组合索引中去:

explain select count(*) from log_login
where user_name = 'diandaxia' and client_type = 2 and hard_env_id = 'DFBE9004F60C319F7C5401DF38307ED1'
and login_flag = 0 and login_time between '2022-05-11 11:11:11' and '2022-12-11 11:11:11'; explain select count(*) from log_login
where user_name = 'diandaxia' and client_type = 2 and hard_env_id = 'DFBE9004F60C319F7C5401DF38307ED1'
and login_flag = 1


====================================================================
这里我又有个疑问,就是 联合索引里,若有范围查询的怎么办,比如上面的这个login_time ,这个需要 大于 或 小于 这种的 范围查询

接下来我们测试一下,把login_time 放到 中间,看看,是否会向他说的那样,后阻碍后面的索引;

然后sql语句修改下:
explain select count(*) from log_login
where user_name = 'diandaxia' and client_type = 2 and login_time between '2022-05-11 11:11:11' and '2022-12-11 11:11:11'
and hard_env_id = 'DFBE9004F60C319F7C5401DF38307ED1' and login_flag = 0;

最后 B+ 树的原理:

mysql 索引优化 explain,复合索引,联合索引,优化 user_base 和 log_login 实战的更多相关文章
- MYSQL 什么时候用单列索引?什么使用用联合索引?(收集)
我一个表 students 表,有3个字段 ,id,name,age 我要查询 通过 name 和age,在这两个字段 是创建 联合索引?还是分别在name和age上创建 单列索引呢? 多个字段查询什 ...
- MYSQL 什么时候用单列索引?什么使用用联合索引?
我一个表 students 表,有3个字段 ,id,name,age 我要查询 通过 name 和age,在这两个字段 是创建 联合索引?还是分别在name和age上创建 单列索引呢? 多个字段查询什 ...
- [MySQL] mysql索引的长度计算和联合索引
1.所有的索引字段,如果没有设置not null,则需要加一个字节.2.定长字段,int占4个字节.date占3个字节.char(n)占n个字符.3.变长字段,varchar(n),则有n个字符+两个 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(十二)数据层优化-explain关键字及慢sql优化
本文提要 从编码角度来优化数据层的话,我首先会去查一下项目中运行的sql语句,定位到瓶颈是否出现在这里,首先去优化sql语句,而慢sql就是其中的主要优化对象,对于慢sql,顾名思义就是花费较多执行时 ...
- mysql索引之四:复合索引之最左前缀原理,索引选择性,索引优化策略之前缀索引
高效使用索引的首要条件是知道什么样的查询会使用到索引,这个问题和B+Tree中的“最左前缀原理”有关,下面通过例子说明最左前缀原理. 一.最左前缀索引 这里先说一下联合索引的概念.MySQL中的索引可 ...
- mysql索引 多个单列索引和联合索引的区别详解
背景: 为了提高数据库效率,建索引是家常便饭:那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里详细测试分析下. 一.联合索引测 ...
- mySql单列索引与联合索引的区别
引自https://my.oschina.net/857359351/blog/658668 第一张表gift和索引为联合索引,如图: 第二张表gift2为单列索引,如图: 下面开始进行测试: 相同的 ...
- mysql 索引学习--多条件等值查询,顺序不同也能应用联合索引啦
以前学习这一块的时候,是说:假设建立了联合索引a+b,那么查询语句也一定要是这个顺序才能应用该索引. 那么实际是怎样呢,经过mysql这么多次版本升级,相信mysql已经给我们做了某些优化. 下面是我 ...
- MySQL单列索引和组合索引(联合索引)的区别详解
发现index merge局限性,优化器会自动判断是否使用 index merge 优化技术,查询还是需要组合索引[推荐阅读:对mysql使用索引的误解] MySQL单列索引和组合索引(联合索引)的区 ...
- MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序
MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序 What's Index ? 索引就是帮助RDBMS高效获取数据的数据结构. 索引可以让我们避免一行一行进行全表扫描.它的 ...
随机推荐
- vue-element-admin完整开源项目介绍、本地部署和初步探索
1 说明: 1.1 从一个广受好评的开源项目:vue-element-admin的本地化,来初步分析vue的相关知识. 2 github地址和下载本地部署: https://github.com/Pa ...
- uni-app 从入门到放弃(持续更新)
https://blog.csdn.net/weixin_33940102/article/details/91460204
- freeswitch on debian docker
概述 freeswitch是一款简单好用的VOIP开源软交换平台. 因为centos系统期限的原因,尝试在debian的docker上使用fs. 环境 docker engine:Version 24 ...
- LightOJ 1094
题意:就是求一个树的直径,也就是求任意两点的最大距离. 做法:跑两遍DFS,详见代码. #include<iostream> #include<cstdio> #include ...
- plsql打开报错:Control 'dxDockBrowserPanel' has no parent window问题解决
一.现象: 使用plsql登陆oracle数据库时,登陆信息没有报错,但是最后一步报错,重启电脑依然没有解决 一直报:" Control 'dxDockBrowserPanel' has n ...
- kafka 在 zookeeper 中保存的数据内容
转载请注明出处: 1. 服务器上下载 kafka : wget https://archive.apache.org/dist/kafka/2.4.0/kafka_2.12-3.2.0.tgz 2. ...
- spring--JDK动态代理的实现原理
JDK 动态代理的实现原理涉及到 Java 的反射机制.它允许在运行时动态创建一个代理类,这个代理类实现了一组接口,并将所有方法调用转发到一个 InvocationHandler 实例.下面是 JDK ...
- 06-Shell内置命令
1.内置命令介绍 Shell 内置命令,就是由 Bash Shell 自身提供的命令,而不是文件系统中的可执行文件. 使用type 来确定一个命令是否是内置命令: type 命令 通常来说,内置命令会 ...
- Metastability 亚稳态问题
亚稳态问题 各种跨时钟域的问题都会归结于亚稳态的问题,IP设计时钟域不超过两个,对于CDC设计要求不高;对于SoC设计来说,CDC处理十分重要 1.什么是亚稳态? transition time 是可 ...
- std::istringstream的用法
1.概要 std::istringstream 是 C++ 标准库中的一个类,它用于从字符串中提取数据,并将数据转换为不同的数据类型.它通常用于从字符串中解析数据,例如整数.浮点数等.以下是关于 st ...