Mysql索引-学习笔记

news2024/11/4 21:09:48

联合索引

在where子句中仅使用联合索引的第二个字段会导致性能问题

在使用联合索引时,如果where子句中仅仅使用联合索引的第二个字段作为过滤条件,将可能导致索引类型为ALL或者index
接下来,我们将做一个实验:

  • 首先创建一个包含两个联合索引的表index_table2
-- 创建表
CREATE TABLE index_table2 (
  ID INT AUTO_INCREMENT PRIMARY KEY,
  idx1_field1 VARCHAR(255) NOT NULL,
  idx1_field2 VARCHAR(255) NOT NULL,
  idx2_field3 VARCHAR(255) NOT NULL,
  idx2_field4 VARCHAR(255) NOT NULL
) ENGINE=InnoDB;


-- 创建联合索引
CREATE INDEX idx_index1 ON index_table2 (idx1_field1, idx1_field2);
CREATE INDEX idx_index2 ON index_table2 (idx2_field3, idx2_field4);


-- 插入 5000 条随机测试数据
DELIMITER $$
CREATE PROCEDURE insert_random_data()
BEGIN
  DECLARE i INT DEFAULT 1;
  WHILE i <= 5000 DO
    INSERT INTO index_table2 (idx1_field1, idx1_field2, idx2_field3, idx2_field4)
    VALUES (
      CONCAT('idx1_field1', FLOOR(1 + RAND() * 10000)),
      CONCAT('idx1_field2', FLOOR(1 + RAND() * 10000)),
      CONCAT('idx2_field3', FLOOR(1 + RAND() * 10000)),
      CONCAT('idx2_field4', FLOOR(1 + RAND() * 10000)),
      CONCAT('no_idx_field5_', FLOOR(1 + RAND() * 10000))
    );
    SET i = i + 1;
  END WHILE;
END $$
DELIMITER ;

CALL insert_random_data();
  • 接下来,我们将分析,where子句使用不同的字段对性能的影响。
-- 查询联合索引,如果 select 中的字段是联合索引的一部分,且 where 子句字段是联合索引的第一个字段,那么 type 为 ref
explain
select idx1_field1 from index_table2 it where idx1_field1 = 'idx1_field18151'
-- type ref

explain
select idx1_field2 from index_table2 it where idx1_field1 = 'idx1_field18151'
-- type ref


-- 查询联合索引,如果 select 中的字段补是联合索引的一部分,且 where 子句字段是联合索引的第一个字段,那么 type 为 ref
explain
select idx2_field3 from index_table2 it where idx1_field1 = 'idx1_field18151'
-- type ref

explain
select idx2_field4 from index_table2 it where idx1_field1 = 'idx1_field18151'
-- type ref

explain
select field5 from index_table2 it where idx1_field1 = 'idx1_field18151'
-- type ref

可以看到,如果where子句使用的是联合索引的第一个字段,那么无论查询哪个字段使用的都是ref索引。

-- 查询联合索引,如果 select 中的字段补是联合索引的一部分,且 where 子句字段不是联合索引的第一个字段,那么 type 为 ref
explain
select idx2_field3 from index_table2 it where idx1_field2 = 'idx1_field18151'
-- type ALL

explain
select idx2_field4 from index_table2 it where idx1_field2 = 'idx1_field18151'
-- type ALL

explain
select field5 from index_table2 it where idx1_field2 = 'idx1_field18151'
-- type ALL

-- 查询联合索引,如果 select 中的字段是联合索引的一部分,且 where 子句字段不是联合索引的第一个字段,那么 type 为 index
explain
select idx1_field1 from index_table2 it where idx1_field2 = 'idx1_field18151'
-- type index

explain
select idx1_field2 from index_table2 it where idx1_field2 = 'idx1_field18151'
-- type index

可以看到,如果where子句仅仅使用联合索引的第二个字段作为过滤条件,那么如果select中的字段不在联合索引中,就会使用全表查询,如果使用的字段在联合索引中,那么就会使用index索引。

如果希望使用联合索引的第二个字段作为过滤条件,此时应该在where子句中加上联合索引的第一个字段,这两个字段在where子句中的顺序,或者有其他where语句,并不影响使用ref索引。

explain
select field5 from index_table2 it where idx1_field2 = 'idx1_field29359' and idx2_field3 = 'idx2_field32298' and idx1_field1 = 'idx1_field11499';
-- ref

如果过滤条件不希望使用第一个字段,但又必须使用以免影响索引,这个时候给第一个字段一个范围值即可,比如Like语句或者使用一个可以包括所有数据的范围。指定第一个字段条件为 Is not null 会利用到索引,但并非最佳。假设 idx1_field1 和 idx1_field2 是联合索引,理想情况下,MySQL会完全利用到联合索引,才能达到最佳的查询效率。但IS NOT NULL这种条件可能不如一个具体的范围条件高效。

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

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

相关文章

Web应用性能测试工具 - httpstat

在数字化时代&#xff0c;网站的性能直接影响用户体验和业务成功。你是否曾经在浏览网页时&#xff0c;遇到加载缓慢的困扰&#xff1f;在这个快速变化的互联网环境中&#xff0c;如何快速诊断和优化Web应用的性能呢&#xff1f;今天&#xff0c;我们将探讨一个强大的工具——h…

(57)MATLAB使用迫零均衡器和MMSE均衡器的BPSK调制系统仿真

文章目录 前言一、仿真测试模型二、仿真代码三、仿真结果四、迫零均衡器和MMSE均衡器的实现1.均衡器的MATLAB实现2.均衡器的性能测试 总结 前言 本文给出仿真模型与MATLAB代码&#xff0c;分别使用具有ISI的三个不同传输特性的信道&#xff0c;仿真测试了使用迫零均衡器和MMSE…

用ChatGPT提升工作效率:从理论到实际应用

伴人工智能技术的迅速演进&#xff0c;像ChatGPT这类语言模型已成为提升工作效率的关键工具。这类模型不仅具备处理海量数据的能力&#xff0c;还能自动化许多日常任务&#xff0c;从而提高决策的准确性。本文将深入探讨如何在工作中利用ChatGPT等AI工具提升效率&#xff0c;涵…

MySQL FIND_IN_SET 函数详解

文章目录 1. 基本语法2. 使用场景3. 实战示例3.1 基础查询示例3.2 与其他函数结合使用3.3 动态条件查询 4. 性能考虑5. 常见问题和解决方案5.1 大小写敏感问题5.2 空值处理5.3 模糊匹配 6. 总结 1. 基本语法 FIND_IN_SET 函数的基本语法如下&#xff1a; FIND_IN_SET(str, st…

「Mac畅玩鸿蒙与硬件15」鸿蒙UI组件篇5 - Slider 和 Progress 组件

Slider 和 Progress 是鸿蒙系统中的常用 UI 组件。Slider 控制数值输入&#xff0c;如音量调节&#xff1b;Progress 显示任务的完成状态&#xff0c;如下载进度。本文通过代码示例展示如何使用这些组件&#xff0c;并涵盖 进度条类型介绍、节流优化、状态同步 和 定时器动态更…

ZDH权限-扩展支持数据权限

目录 项目源码 预览地址 安装包下载地址 ZDH权限模块 ZDH权限扩展更细粒度方案 第一种方案&#xff1a; 第二种方案&#xff1a; ZDH权限扩展支持数据权限-新增属性 总结 感谢支持 项目源码 zdh_web: GitHub - zhaoyachao/zdh_web: 大数据采集,抽取平台 预览地址 后…

私有化视频平台EasyCVR海康大华宇视视频平台视频诊断技术是如何实时监测视频质量的?

在现代视频监控系统中&#xff0c;确保视频流的质量和稳定性至关重要。随着技术的进步&#xff0c;视频诊断技术已经成为实时监测视频质量的关键工具。这种技术通过智能分析算法对视频流进行实时评估和处理&#xff0c;能够自动识别视频中的各种质量问题&#xff0c;并给出相应…

Java 用户随机选择导入ZIP文件,解压内部word模板并入库,Windows/可视化Linux系统某麒麟国防系统...均可适配

1.效果 压缩包内部文件 2.依赖 <!--支持Zip--><dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>2.11.5</version></dependency>总之是要File类变MultipartFile类型的 好像是…

论文笔记(五十四)pi0: A Vision-Language-Action Flow Model for General Robot Control

π0: A Vision-Language-Action Flow Model for General Robot Control 文章概括摘要I. INTRODUCTIONII. RELATED WORKIII. OVERVIEWIV. π 0 \pi_0 π0​模型V. 数据收集和培训配方A. 预训练和后训练B. 语言和高级策略C. 机器人系统细节 VI. 实验评估A. 基础模型评估B. 遵循语…

《AI产品经理手册》——解锁AI时代的商业密钥

在当今这个日新月异的AI时代&#xff0c;每一位产品经理都面临着前所未有的挑战与机遇&#xff0c;唯有紧跟时代潮流&#xff0c;深入掌握AI技术的精髓&#xff0c;才能在激烈的市场竞争中独占鳌头。《AI产品经理手册》正是这样一部为AI产品经理量身定制的实战宝典&#xff0c;…

论文略读:Self-Knowledge Guided Retrieval Augmentation for Large Language Models

2023 emnlp findings RAG 召回的辅助信息不总是有用&#xff0c;甚至可能起负作用 原本对“德牧能不能进机场”这样的问题&#xff0c;ChatGPT是高度认可德牧作为导盲犬的但是检索模块召回了一段“老德牧是一类 balabala 某种狗的争议性名称”的百科介绍作为额外上文输入后&am…

使用Postman进行API测试

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Postman进行API测试 Postman 简介 安装 Postman 创建请求 组织请求 发送请求 查看响应 使用环境变量 编写测试脚本 示例测试…

鸿蒙系统的优势 不足以及兼容性与未来发展前景分析

2024 年 10 月 22 日&#xff1a;华为正式发布原生鸿蒙操作系统 HarmonyOS next&#xff0c;并正式命名为 HarmonyOS 5&#xff0c;这是鸿蒙系统史上最大的升级&#xff0c;实现了国产操作系统从底层架构到应用生态的全面自主可控。 鸿蒙系统与安卓、iOS 相比&#xff0c;具有…

MT1421-MT1430 码题集 (c 语言详解)

目录 MT1421异或 MT1422总位数 MT1423被3整除 MT1424卡特兰序列 MT1425小码哥的序列 MT1426普洛尼克数 MT1427素数序列 MT1428最小素数因子 MT1429最小正整数 MT1430回文数组 MT1421异或 给定一个由N(<1000)个整数组成的数组&#xff0c;把数组元素任意两两进行异或&#x…

游游的游戏大礼包

游游的游戏大礼包 import java.util.*; public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);long n in.nextInt();long m in.nextInt();long a in.nextInt();long b in.nextInt();long ret 0;for(long x 0; x < Math.…

SpringBoot框架:作业管理系统构建之道

摘 要 使用旧方法对作业管理信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在作业管理信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的作业管理系统有管…

Python小游戏19——滑雪小游戏

运行效果 python代码 import pygame import random # 初始化Pygame pygame.init() # 设置屏幕尺寸 screen_width 800 screen_height 600 screen pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("滑雪小游戏") # 定义颜色 WH…

自定义规则配置教程

大家在使用waf的时候&#xff0c;因为业务特殊性和waf的严格校验&#xff0c;有时会产生误报&#xff0c;阻拦合法流量。 这个时候&#xff0c;只能通过自定义规则进行补充&#xff0c;选择加白名单或者黑名单。 很多人会说配置黑白名单失效了&#xff0c;其实95%以上都是自己…

HarmonyOS ArkTS Web组件jsbridge

1. HarmonyOS ArkTS Web组件jsbridge 1.1. Web组件引入和调用JS库 关于ts可以调用JS库&#xff0c;可以使用以下几种方式&#xff1a;文档中心&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-arkweb-kit-V5 1.1.1. 鸿蒙系统H5 JSBridge的…

C++笔试题之实现一个定时器

一.定时器&#xff08;timer&#xff09;的需求 1.执行定时任务的时&#xff0c;主线程不阻塞&#xff0c;所以timer必须至少持有一个线程用于执行定时任务 2.考虑到timer线程资源的合理利用&#xff0c;一个timer需要能够管理多个定时任务&#xff0c;所以timer要支持增删任务…