首页 > 数据库 >MySQL联合索引

MySQL联合索引

时间:2023-01-05 19:34:33浏览次数:48  
标签:扫描 回表 索引 全表 联合 MySQL where select

eg, 表t中含有abcde五个字段,a为主键,bcd有联合索引

CREATE TABLE `t` (
  `a` int primary key,
  `b` int,
  `c` int,
  `d` int,
  `e` varchar(20)
) ENGINE=InnoDB;

create index idx_t_bcd on t(b,c,d);

create index idx_t_e on t(e);

为什么遵循最左前缀原则才能利用到索引

结合联合索引的结构,局部有序

范围查找导致索引失效的原因

select * from t where b > 1;

此时走的是全表扫描,why?
因为是select * ,要回表,全表扫描的话无需回表,innodb如果判断回表次数太多,就会选择全表扫描,但是如果需要回表的次数比较少,比如b>6,就可以走索引。

覆盖索引

select a,b,c,d from t where b > 1;

可以走索引,并且using index(覆盖索引),因为索引里面本身就有b字段,无需回表

索引扫描原理

select b from t

可以走bcd索引,因为相比于全表扫描,一页中的数据肯定是没有非聚簇索引叶子节点的页存储的数据多,因此同样的数据量扫描索引的叶子节点遍历的页更少。而且select的字段只要是属于索引的列或主键列都可以走索引,此时并不需要最左前缀原则,因为是全部扫描。

order by导致索引失效

select * from t order by b,c,d;
  1. 走bcd联合索引,扫描叶子节点,每个数据根据主键回表查找(有几个数据回表几次),由于是有序的所以无需再排序

  2. 全表扫描,加载到内存后根据bcd进行排序(不需要回表)
    此时就会走全表扫描

然而,

select b from t order by b,c,d;

就不需要回表,因此采用走索引的方式

对字符进行操作导致索引失效

数据类型转换

select 'a' = 0; -- 1
select 'b' = 1; -- 0
select 'b' = 0; -- 1

可以发现,在字符和数字进行比较时,MySQL会将字符隐式转换为数字,如上,字符都会被转成0,但是'123'会被转成数字123

select * from t where a = 'a';

相当于

select * from t where a = 0;

select * from t where a = '1';

相当于

select * from t where a = 1;

另外一个场景:

select * from t where e = 1

会先将所有e列的值转为数字,然后再进行比较(没法走索引,因为走的话得改索引)

标签:扫描,回表,索引,全表,联合,MySQL,where,select
From: https://www.cnblogs.com/antidogmatist/p/17028681.html

相关文章

  • Ajax+WCF+MySQL实现数据库部署并调用
    ​         最近的数据库课程要求将MySQL数据库部署在服务器上,参考了大佬们的博客后,总结一下。    先放上参考的大佬们的博客。        【原......
  • ubuntu关闭mysql开机自启动
    TodisableMySQLfromstartingautomaticallyatboottimeonUbuntu,followthesesteps:Openaterminalwindow.UsethefollowingcommandtostoptheMySQLs......
  • distributor和gateway联合实现出中继的负载均衡+故障转移
      概述freeswitch是一款简单好用的VOIP开源软交换平台。在之前的文章,我们介绍过distributor模块实现多线路分发的配置方法,但是当线路发生故障时,distributor并不会自......
  • window下MySQL的压缩包方式安装--单版本或多版本(5.7和8共存)通用
    环境:win11MySQL版本:5.7和8.311.下载MySQL数据库注意:记得查看自己电脑是32位还是64位的,这里下的64位的,64位的电脑可以用32位的包,32位的用64的包可能有问题8版本官网下......
  • mysql学习笔记
    1、​​MySQL索引详细介绍​​2、MySql索引实现原理索引的本质MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构提取句子主干,就可以得到索引的本质:索......
  • 探索连锁门店数字化管理转型之路,贝锐蒲公英x熙菱易联网关 联合解决方案解析
    在连锁门店这一领域,企业的规模越大,下辖的连锁门店越多,管理难度就越大,而且很多情况下管理困难是呈指数形式增加的。具体到困难本身,往往会分为品牌维护以及管理成本两方......
  • shell备份mysql数据库指定表
    1、先执行命令:netstat -ln |grep mysql获取当前mysql的socket  2、执行如下命令备份数据库的指定表mysqldump -hIP-P端口-u数据库用户-p数据库密码--sock=......
  • 一个查找mysql数据库无主键表的脚本
    说明:遍历所有的库表然后查询是否具有主键/bin/bashdb_host=172.19.211.2#dbipdb_name_list="chimessoxrayintcommpultus"#填写db_name支持多个数据库,以空格隔......
  • Sqlserver,Mysql基础SQL语句
    Sqlserver,Mysql基础SQL语句SqlServer建表CREATETABLE[IFNOTEXISTS]表名( 字段名列类型[属性], 字段名列类型[属性], ....... 字段名列类型[属性]);......
  • MySQL 8.x 数据库主从复制搭建
    前提:MySQL修改server-uuid的方法前提:如果服务器是克隆master的服务器的,server-uuid值都是一样的。会导致主从复制报错误1593,修改一下server-uuid以后重启MySQL1.查......