最左前缀原则

最左前缀原则:

最左前缀原则”是数据库索引优化中的一个重要概念,尤其在使用复合索引时。复合索引是指在多个列上创建的索引,而最左前缀原则规定:查询时,如果想利用复合索引,查询条件必须从索引中的最左边的列开始匹配。

简单来说,复合索引可以视为多个单列索引的组合,而数据库会按照索引中列的顺序来处理查询。因此,只有从第一个(最左边的)列开始匹配时,索引才会生效。

例如,有一个复合索引 (A, B, C)

  1. 查询条件是 A = ? 时,复合索引可以正常使用。
  2. 查询条件是 A = ? AND B = ? 时,复合索引也可以使用。
  3. 查询条件是 B = ?C = ? 时,复合索引不会生效,因为它没有从最左列 A 开始匹配。

这个原则可以帮助我们优化查询语句,确保索引的有效利用,提升查询性能。

/*最左前缀原则*/use test2;drop table if exists t_customer;create table t_customer(id int primary key auto_increment,name varchar(255),age int,gender char(1),email varchar(255)
);insert into t_customer values(null, 'zhangsan', 20, 'M', 'zhangsan@123.com');
insert into t_customer values(null, 'lisi', 22, 'M', 'lisi@123.com');
insert into t_customer values(null, 'wangwu', 18, 'F', 'wangwu@123.com');
insert into t_customer values(null, 'zhaoliu', 22, 'F', 'zhaoliu@123.com');
insert into t_customer values(null, 'jack', 30, 'M', 'jack@123.com');
# 添加联合索引
create index idx_name_age_gender on t_customer(name, age, gender);
show index from t_customer;/*
最左前缀原则:要想让索引生效,必须遵循最左前缀原则。
最左前缀原则是什么:
如果给t_customer表的name age gender添加了联合系引。
并且在创建索引的时候,顺序是:(name,age,gender)
那么在编写select语句的时候,where当中有很多条件,如果这些条件中
没有name字段的参与,则复合索引会失效。必须有name字段这个最左边的
字段参与条件,这样复合素引才会生效。生效后:可能是完全使用索引,也可能是部分使用案引。*/explain select * from t_customer where name='zhangsan' and age=20 and gender='M'; # 完全使用索引 索引长度1033个字节explain select * from t_customer where name='zhangsan' and age=20; # 部分使用索引 索引长度1028个字节 说明gender在索引当中占用5个字节的长度explain select * from t_customer where name='zhangsan'; # 部分使用索引 索引长度1023个字节 说明age在索引当中占用10个字节的长度explain select * from t_customer where age=20 and gender='M' and name='zhangsan'; # 完全使用索引explain select * from t_customer where age=20 and gender='M'; # 不使用索引 原因:没有name条件的出现explain select * from t_customer where name = 'zhangsan' and gender='M'; #部分使用索引、只有name字段使用索引,因为中间断开了,导致gender没有使用索explain select * from t_customer where name = 'zhangsan' and gender='M' and age = 20; #全部使用索引explain select *from t_customer where name= 'zhangsan'and age>20 and gender='M'; /*当使用范围查找的时候,范围条件右侧的列不条使用索引*/explain select *from t_customer where name= 'zhangsan' and age>=20 and gender='M';# 使用>=即可
  • 索引列参与了运算,索引失效

    • 当查询条件中使用索引列进行运算时,索引失效。
      explain select * from t_emp where sal > 5000;
      explain select * from t_emp where sal * 10 > 50000;  -- 索引失效
      
  • 模糊查询以 % 开头,索引失效

    • 在进行模糊查询时,如果通配符 % 位于字符串的开头,索引将无法使用。
    explain select * from t_emp where name like '张%';
    explain select * from t_emp where name like '%飞';   -- 索引失效
    explain select * from t_emp where name like '%飞%';  -- 索引失效
    

  • 字符串类型索引列,查询时省略单引号,索引失效

    • 如果索引列是字符串类型,而查询时未使用单引号,可能导致索引失效。
  • OR 查询条件中,未添加索引的字段导致索引失效

    • 当查询条件中包含 OR,且其中一个字段未添加索引,索引失效。
    explain select * from t_emp where name = '张三' or sal = 5000;
    alter table t_emp drop index idx_t_emp_sal;
    explain select * from t_emp where name = '张三' or sal = 5000;  -- 索引失效
    
  • 查询符合条件的记录在表中占比较大,索引失效

    • 当查询的结果集中,符合条件的记录占表中较大比例时,索引可能失效。数据库可能选择进行全表扫描。
  • IS NULLIS NOT NULL 导致索引失效

    • 当查询条件为 IS NULLIS NOT NULL 时,索引通常会失效,特别是在 NULL非 NULL 值占比较大的情况下。
    SELECT * FROM t_emp WHERE sal IS NULL;    -- 索引失效
    SELECT * FROM t_emp WHERE sal IS NOT NULL;  -- 索引失效
    
    /*
    索引失效的情况
    1.索引列参加了运算,索引列会失效*/
    create table t_emp(id int primary key auto_increment,name varchar(255),sal int,age char(2)
    );insert into t_emp values(null, '张三', 5000, '20');
    insert into t_emp values(null, '宋飞', 4000, '30');
    insert into t_emp values(null, '李飞', 6000, '40');create index idx_t_emp_name on t_emp(name);
    create index idx_t_emp_sal on t_emp(sal);
    create index idx_t_emp_age on t_emp(age);
    explain select * from t_emp where sal > 5000;
    explain select * from t_emp where sal * 10 > 50000; # 索引失效/*
    索引列进行模糊查询时以 %开始的,索引失效*/
    explain select * from t_emp where name like '张%';
    explain select * from t_emp where name like '%飞'; #失效
    explain select * from t_emp where name like '%飞%'; #失效/*索引列是字符串类型,但查询时省略了单引号,索引失效*//*
    查询条件中有or,只要有未添加索引的字段,索引失效*/
    show index from t_emp;
    explain select * from t_emp where name = '张三' or sal = 5000;
    alter table t_emp  drop index idx_t_emp_sal;
    explain select * from t_emp where name = '张三' or sal = 5000; #失效/*
    当查询的符合条件的记录在表中占比较大,索引失效*//*关于is nu1l和is not null的索引失效问题*/
    SELECT * FROM t_emp WHERE sal IS NULL;
    #假设表 t_emp 中有许多 NULL 值,
    # 由于 NULL 值不参与索引的存储,数据库无法利用索引直接定位 NULL 值,需要扫描整个表,索引在此情况下失效。
    SELECT * FROM t_emp WHERE sal IS NOT NULL;
    #当 NULL 值占比较大时,使用 IS NOT NULL 的查询会导致数据库扫描大多数的记录,
    # 这时即使有索引,数据库认为使用索引的性能优势不足,也可能放弃索引,改为全表扫描。

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

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

相关文章

服务运营 | 运营前沿:生成式AI改变医疗保健的运作方式

编者按 人工智能正在重塑医疗保健的运作方式,减少医生负担并优化病人的就医体验。从解答患者疑问到开发新药,人工智能正在快速革新医疗保健这一行业。编者团队此次将关注《哈佛商业评论》于2023年11月27日发布的文章《GenAI Could Transform How Health …

数字乡村解决方案-3

1. 国家大数据战略与数字乡村 中国第十三个五年规划纲要强调实施国家大数据战略,加快建设数字中国,推进数据资源整合和开放共享,保障数据安全,以大数据助力产业转型升级和提高社会治理的精准性与有效性。 2. 大数据与数字经济 …

【韩顺平Java笔记】第2章:Java概述

按视频的标号来对应小标题,自用学习笔记 文章目录 5. 内容梳理6. 程序举例6.1 什么是程序 7. Java故事7.1 Java诞生小故事7.2 Java技术体系平台 8. Java特性8.1 Java重要特点 9. sublime10. jdk介绍10.1 Java运行机制及运行过程10.1.1 Java虚拟机(JVM&a…

如何配置路由器支持UDP

一、UDP协议简介 UDP是一种传输层协议,与TCP(传输控制协议)不同,它不需要建立连接,因此传输速度较快。由于UDP不需要确认数据包的接收状态,它适用于不需要严格数据完整性但需要低延迟的场景。 常见的UDP应…

无人机飞手入伍当兵技术优势分析

随着现代战争形态的不断演变,无人机技术在军事领域的应用日益广泛,成为提升军队作战能力的重要手段。对于无人机飞手而言,其专业技能和实战经验在入伍当兵后能够转化为显著的技术优势,为国防事业贡献重要力量。以下是从专业技能优…

如何保障S2B2C商城功能的完整实现

前言 要保障 S2B2C 商城功能的完整实现,可以从以下几个方面着手: 一、技术层面 选择可靠的技术架构和平台 评估不同的电商技术解决方案,选择具有高扩展性、稳定性和安全性的架构。例如,采用微服务架构可以提高系统的灵活性和可…

【滑动窗口】-30. 串联所有单词的子串

leetcode官网给的题解跟shit一样!!! 官网题解:https://leetcode.cn/problems/substring-with-concatenation-of-all-words/solutions/1616997/chuan-lian-suo-you-dan-ci-de-zi-chuan-by-244a/ 我写的比官网好理解 官网的题解看不…

【学习笔记】TLS/SSL握手之Records

TLS / SSL会话是由记录(Records)所组成,有4种records HandshakeAlertChange Cipher SpecApplication DataHandshake和Alert Records被分为子类型(Subtypes): Handshake:Client HelloHandshake&a…

Dubbo 如何使用 Zookeeper 作为注册中心:原理、优势与实现详解

Dubbo 是一个高性能的 Java 分布式服务框架,而 Zookeeper 常被用作 Dubbo 的服务注册中心。Zookeeper 提供了分布式一致性和协调服务,Dubbo 通过 Zookeeper 实现服务注册与发现功能,确保在分布式环境下服务实例的动态管理和可靠发现。 下面是…

主数据管理的核心价值是什么

主数据在标准化的基础上实现唯一化,通过主数据的唯一性保障在各系统之间基础数据的一致性,并且能够被各系统在交互互数据时直接使用,无需额外维护映射表(字段)和进行翻译等处理,为此主数据必须做到"一实体一编码"&#…

Miniforge详细安装教程(macOs和Windows)

(注:主要是解决商业应用anaconda收费问题,这是轻量级的代替,个人完全可以使用anaconda和miniconda) Miniforge 是一个轻量级的包管理器,类似于 Anaconda 和 Miniconda。它主要用于安装基于 conda 的 Python 环境,专注于…

Java新手指南:从菜鸟到编程大师的趣味之路-多态

这里是Themberfue 本章讲的是Java三大特性之一的多态,也是最后一个特性 多态概念 既然我们要学习多态,首先得知道这玩意儿到底是个什么东西? 通俗地说,多态其实就是多种形态。具体来说就是去完成某个行为,当不同的对象…

Secret Configmap

应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名,密码或者秘钥,讲这些信息直接保存在容器镜像中显然不合适,kubernetes提供的解决方案就是Secret Secret会以密文的方式存储数据,避免了直接在配置文件中保…

极狐GitLab 17.4 重点功能解读【四】

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…

tauri开发配置文件和文件夹访问路径问题

文件夹没权限:Unhandled Promise Rejection: path not allowed on the configured scope: /Users/song/Library/Application Support/com.pakeplus.app/assets/default.png 没有文件夹,需要先创建:Unhandled Promise Rejection: path: /Users…

数据结构与算法——Java实现 24.中缀表达式转后缀

目录 中缀表达式转后缀表达式 引言 思路 代码 正因为我有能力跨越,考验才会降临 —— 24.9.28 中缀表达式转后缀表达式 引言 Java中的编译器会将我们编写代码中的中缀表达式转化为后缀表达式,然后编译好输出程序 思路 遍历中缀表达式,如果遇…

javaweb之会话管理

Cookie: 1. Cookie 的定义 Cookie 是存储在用户浏览器中的小块数据,通常由服务器发送并存储,以便在用户浏览器和服务器之间保持会话状态。每次用户发送请求时,浏览器都会自动附带相应的 Cookie,允许服务器辨识用户。…

亚信安慧AntDB基于操作符的隐式转换

背景 在新一代信息技术创新应用的大背景下,为了降低用户使用成本、加快改造速度,很多数据库产品都在做Oracle兼容性适配。AntDB作为一款成熟、稳定的国产数据库,高度兼容Oracle语法。本文将主要介绍AntDB数据库基于操作符的隐式转换及其设计…

JSR 303学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程:封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

低代码可视化-UniApp二维码可视化-代码生成器

市面上提供了各种各样的二维码组件,做了一简单的uniapp二维码组件,二维码实现依赖davidshimjs/qrcodejs。 组件特点 跨浏览器支持:利用Canvas元素实现二维码的跨浏览器兼容性,兼容微信小程序、h5、app。 无依赖性:QR…