【MySQL】索引使用规则——(覆盖索引,单列索引,联合索引,前缀索引,SQL提示,数据分布影响,查询失效情况)

本文主要是介绍【MySQL】索引使用规则——(覆盖索引,单列索引,联合索引,前缀索引,SQL提示,数据分布影响,查询失效情况),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁
主要内容含:
在这里插入图片描述

欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!

  • YY的《C++》专栏
  • YY的《C++11》专栏
  • YY的《Linux》专栏
  • YY的《数据结构》专栏
  • YY的《C语言基础》专栏
  • YY的《单片机》专栏
  • YY的《STM32》专栏
  • YY的《数据库》专栏

    目录

    • 一.索引使用规则
      • ※.验证索引效率提升
      • 1.覆盖索引——查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到
      • 2.单列索引&联合索引
      • 3.前缀索引——解决冗长字符串与索引问题
        • 【1】前缀索引&索引选择性的介绍
        • 【2】前缀索引创建演示:
      • 5.SQL提示——指定某个索引/忽略索引/强制索引
      • 6.数据分布影响——MySQL自我评估
      • 7.查询失效的几种情况
        • 【1】违背——最左前缀法则(联合索引)
        • 【2】范围查询右侧失效
        • 【3】用or分割开的条件,or后面没索引,所有索引失效
        • 【4】索引列上进行运算操作,索引失效
        • 【5】字符串类型字段使用时,不加引号,索引失效
        • 【6】头部模糊匹配,索引失效

目录

  • 一.索引使用规则
    • ※.验证索引效率提升
    • 1.覆盖索引——查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到
    • 2.单列索引&联合索引
    • 3.前缀索引——解决冗长字符串与索引问题
      • 【1】前缀索引&索引选择性的介绍
      • 【2】前缀索引创建演示:
    • 5.SQL提示——指定某个索引/忽略索引/强制索引
    • 6.数据分布影响——MySQL自我评估
    • 7.查询失效的几种情况
      • 【1】违背——最左前缀法则(联合索引)
      • 【2】范围查询右侧失效
      • 【3】用or分割开的条件,or后面没索引,所有索引失效
      • 【4】索引列上进行运算操作,索引失效
      • 【5】字符串类型字段使用时,不加引号,索引失效
      • 【6】头部模糊匹配,索引失效

一.索引使用规则

※.验证索引效率提升

在这里插入图片描述

  • 在未建立索引之前,执行如下SOL语句,查看SQL的耗时
  • 耗时11s
    在这里插入图片描述
  • 利用主键索引(id)查,耗时0s
    在这里插入图片描述
  • 利用第二个字段sn查,耗时21s,性能极低
    在这里插入图片描述
  • 针对字段sn创建索引,然后再次执行相同的SQL语句,再次查看SQL的耗时
  • 从21s变成0.01s,性能大大提升

-
在这里插入图片描述

1.覆盖索引——查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到

  • 尽量使用覆盖索引 (查询使用了素引,并且需要返回的列,在该索引中已经全部能够找到) ,减少select *
    在这里插入图片描述

演示:

  • 我们查看索引
    在这里插入图片描述
  • 紫色部分:上面比下面的效率好
    在这里插入图片描述
  • 多出的蓝色部分(返回的列),不能够在在该索引中找到, 上部分的效率比下部分高
  • 上部分:usingindexcondition:查找使用了索引,但是需要回表查询数据
  • 下部分:using where;using index:查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据在这里插入图片描述

2.单列索引&联合索引

  • 单列索引:即一个索引只包含单个列。
  • 联合家引:即一个索引包含了多个列。
  • 在业务场景中,如果存在多个查询负件,考虑针对于查询字段建立索引时, 建议优先建立联合索引,而非单列引。
  • 多条件联合查询时,MySQL优化器会评估哪个字段的索引效率更高,会选择该索引完成本次查询。 要强制就用可视日志。

演示:

  • name和phone字段,都是单列索引,但只用到一个字段索引
    在这里插入图片描述
  • 我们给name和phone字段创建联合索引,MySQL优化器会评估哪个字段的索引效率更高。如果我们要主动设置SQL语句用的索引,涉及到下文我们提到的SQL提示
    在这里插入图片描述

3.前缀索引——解决冗长字符串与索引问题

【1】前缀索引&索引选择性的介绍

  • 当字段类型为字符串(varchar,text等)时, 有时候需要索引很长的字符串 ,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率。
  • 此时可以只将字符串的 一部分前缀,建立索引 ,这样可以大大节约索引空间,从而提高索引效率。
    在这里插入图片描述
  • 如下图,计算可得 字段选择性是1
    在这里插入图片描述
  • 不断调整substring截取部分,可得到不同选择性
    在这里插入图片描述

【2】前缀索引创建演示:

  • 针对email字段截取字符串,建立前缀索引,降低索引体积
    在这里插入图片描述
  • 建立前五个字符构成的前缀索引
    在这里插入图片描述
  • 查询发现用到了创建的前五个字符构成的前缀索引
    在这里插入图片描述

5.SQL提示——指定某个索引/忽略索引/强制索引

  • SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的。
  • 例如下图SQL执行计划,可能索引有两个,但是最终应用的索引只有一个,某些情况下我们就是要 指定用某个索引
    在这里插入图片描述

在这里插入图片描述

演示:

  • 有这样一张表,我们看下这段SQL的执行计划,索引是 复合索引idx_user_pro_age_sta
    在这里插入图片描述
  • 我们针对profession创建一个单列索引
    在这里插入图片描述
  • 我们想要用这个单列索引,我们就建议索引use XX——MySQL不一定接受,要强制用force XX
    在这里插入图片描述

6.数据分布影响——MySQL自我评估

  • 如果MySQL评估使用索引比全表 更慢 ,则不使用索引

演示:

  • 有一张表,我们关注其phone字段
    在这里插入图片描述
  • 当我们进行不同的范围查询时,MySQL会自己选择用不用索引
  • 例如绿色部分用了联合索引,而红色部分要查找的数目已经大于总数一半了,此时MySQL自己选择全表扫描
    在这里插入图片描述

7.查询失效的几种情况

【1】违背——最左前缀法则(联合索引)

  • 如果索引了多列(联合索引),要遵守最左前缀法则。
  • 最左前缀法则指的是查询从索引的最左列开始 (最左列存在即可),并且不跳过索引中的列,索引才不会失效
  • 如果跳跃某一列 ,索引将部分失效 (后面的字段索引失效)

演示:

  • 有如下表
    在这里插入图片描述
  • 查看索引,有一个age字段和status字段的联合索引idx_user_pro_age_sta
    在这里插入图片描述
  • 联合索引生效,索引长度为54在这里插入图片描述
  • 去掉status条件后,索引长度为49,因此可以判断status部分对应的索引长度为5
    在这里插入图片描述
  • 去掉status和age条件后,索引长度为47,因此可以判断age部分对应索引长度为2
    在这里插入图片描述

索引失效:

  • 索引的最左列不存在,key为null,不走索引,走全表扫描
    在这里插入图片描述

  • 去除掉age,也会走联合索引,但是长度只有47, 只有profession部分走索引 ,部分失效
    -

  • 注: 索引的最左列只要存在即可,顺序无所谓
    在这里插入图片描述

【2】范围查询右侧失效

  • 联合索引中,出现范围查询(>,<), 查询范围右侧的列索引失效
  • 实际中应该规避(>,<),在业务允许的范围下使用(>=,<=),(>=,<=)不会失效

演示:

  • 如下图,联合索引正常长度应该是54,图中是49,说明没有走status索引——status索引失效了
    在这里插入图片描述
  • 如下图,采用>=,索引长度为54,说明 >=的范围查询不会让右侧失效
    在这里插入图片描述

【3】用or分割开的条件,or后面没索引,所有索引失效

  • 如果or前的条件中的列有索引,而后面的列中没有索引,那么 涉及的索引都不会被用到
  • 例如:age无索引,但是主键索引仍然不会生效
    在这里插入图片描述

【4】索引列上进行运算操作,索引失效

  • 不要在索引列上进行运算操作, 索引将失效
    在这里插入图片描述

演示:

  • 有这样一张表,我们关注phone字段
    在这里插入图片描述
  • phone是单列索引,发现用上了
    在这里插入图片描述
  • 我们想要找手机号最后两位是15的,利用substring函数运算截取,第十位开始,截2位
  • 索引失效
    在这里插入图片描述

【5】字符串类型字段使用时,不加引号,索引失效

  • 字符串类型字段使用时,不加引号, 索引失效

演示:

  • phone是varchar类型,不加单引号,也能查
  • 但是由于存在隐式类型转换,索引会失效
    -

【6】头部模糊匹配,索引失效

  • 如果仅仅是 尾部模糊匹配,索引不会失效
  • 如果是 头部模糊匹配,索引失效
    在这里插入图片描述

这篇关于【MySQL】索引使用规则——(覆盖索引,单列索引,联合索引,前缀索引,SQL提示,数据分布影响,查询失效情况)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126520

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传