mysql索引探索

news2024/9/20 0:20:30

《令人困惑的mysql索引》在这篇文章中,遗留了几个困惑。为了解决这些困惑,我又进行了一些测试。

本文中索引的建立,并不一定科学,查询的SQL也不一定科学,只是为了理解mysql索引建的一些测试数据。

CREATE TABLE `cms_reviews`  (
  `id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `entity_type` varchar(100)  NOT NULL COMMENT '实体(对象)类型',
  `entity_id` varchar(100)  NOT NULL COMMENT '实体(对象)ID',
  `reviewer_id` varchar(100) NOT NULL DEFAULT '' COMMENT '评价人ID',
  `entity_relation_id` varchar(100)  NOT NULL DEFAULT '' COMMENT '实体(对象)关联ID',
  `first_review_id` int NULL DEFAULT NULL COMMENT '首评Id',
  `label` varchar(255)  NOT NULL DEFAULT '' COMMENT '标签(JSON格式)',
  `content` varchar(2000)  NOT NULL DEFAULT '' COMMENT '评价内容',
  `image_url` varchar(2000)  NOT NULL DEFAULT '' COMMENT '图片(JSON格式)',
  `video_url` varchar(2000)  NOT NULL DEFAULT '' COMMENT '视频(JSON格式)',
  `rating` varchar(2000)  NOT NULL DEFAULT '' COMMENT '评分(JSON格式)',
  `is_anonymous` tinyint NOT NULL DEFAULT 0 COMMENT '是否匿名:0否、1是',
  `is_default` tinyint NOT NULL DEFAULT 0 COMMENT '是否为系统默认评价:0否、1是',
  `types` tinyint NOT NULL DEFAULT 1 COMMENT '评价类型:1首评、2追评',
  `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1待审核、2审核通过、3审核拒绝、4举报成功、5下架',
  `is_deleted` tinyint NOT NULL DEFAULT 0 COMMENT '已删除:0否、1是',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `deleted_at` datetime NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `idx_created_at`(`created_at` ASC) USING BTREE,
  INDEX `idx_first_review_id`(`first_review_id` ASC) USING BTREE,
  INDEX `idx_entity_id` (`entity_id` ASC) USING BTREE
) ENGINE = InnoDB COMMENT = '评价主表';

当where条件和order条件中字段索引不一致,这种情况下可能会发生优化器索引选择。原来我的理解是,无论哪种情况下,应该都是命中where条件中索引,当然,前提是where条件中索引的区分度很高。但是,在上篇文章中,有些情况还是让我出乎意料,在某些情况下还是有可能走order条件中的索引。

比如,

SELECT * FROM `cms_reviews` WHERE (entity_type = 'DREAME_MALL_ORDER_GOODS_TEST' AND entity_id IN ('20010100001884') AND is_deleted = 0 AND status =1 ) AND types = 2 ORDER BY created_at desc  LIMIT 10

 这种情况下,只查排序中的前几条,就使用了order排序中的字段的索引。我尝试着理解一下,根据b+树的特点,在idx_created_at这颗顺序树中,在(内存)页中去匹配条件效率可能更高,因为,这种情况下,可能一次就查询到满足条件的数据。

但是,如果没有limit限制,如果还是基于idx_created_at这个索引,在内存页中去匹配查询条件,就必然需要遍历idx_created_at这颗树上所有节点,这种情况就没有根据where条件中的idx_entity_id筛选出来的数据在内存中进行排序效率高,所以,在这种情况下,就应该选择idx_entity_id这个索引。

我们看一下去掉limit的情况下,执行计划。

SELECT * FROM `cms_reviews` WHERE (entity_type = 'DREAME_MALL_ORDER_GOODS_TEST' AND entity_id IN ('20010100001884') AND is_deleted = 0 AND status =1 ) AND types = 2 ORDER BY created_at desc  

看了一下执行计划,符合我们上面的推理情况。

所以,应该还有一种情况,也是有可能走idx_entity_id这个索引,offset比较大,基于同样的理由,如果还是选择idx_created_at这个索引,那么,很大的可能是要遍历大部分的节点,才能筛选出满足条件的数据。

我们可以再来验证一下这种情况,看是否符合我们的预期。

SELECT * FROM `cms_reviews` WHERE (entity_type = 'DREAME_MALL_ORDER_GOODS_TEST' AND entity_id IN ('20010100001884') AND is_deleted = 0 AND status =1 ) AND types = 2 ORDER BY created_at desc  LIMIT 10 OFFSET 10000

果然,这种情况下走的idx_entity_id这个索引。

到了这里,上篇文章中的某些困惑也就能够理解了。

接下来,我们需要思考另外一个问题,既然如此,我们是否有必要选择建立联合索引呢?从理论上看建立联合索引的意义并不大,因为只有第一种case走了idx_created_at这个索引。我们不妨以实际测试数据说话。

我用entity_id和update_at两个字段建立联合索引,并对比查询。

SELECT * FROM `cms_reviews` WHERE (entity_type = 'DREAME_MALL_ORDER_GOODS_TEST' AND entity_id IN ('20010100001884') AND is_deleted = 0 AND status =1 ) AND types = 2 ORDER BY created_at desc  LIMIT 10 OFFSET 10000
SELECT * FROM `cms_reviews` WHERE (entity_type = 'DREAME_MALL_ORDER_GOODS_TEST' AND entity_id IN ('20010100001884') AND is_deleted = 0 AND status =1 ) AND types = 2 ORDER BY updated_at desc  LIMIT 10 OFFSET 10000

在单表40W的数据量的情况下查询。两者查询时间没有差别,查询时间在一两百毫秒。

在单表50W的数据量的情况下查询。两者查询时间没有差别,查询时间在一两百毫秒。

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

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

相关文章

加密与安全_双向RSA+AES加密及Code实现

文章目录 AES / RSA流程Code生成AES密钥 和 生成RSA密钥对AES工具类,提供AES加密和解密功能RSA加密工具类测试类 总结 AES / RSA AES:一种对称加密算法,意味着加密和解密使用相同的密钥。速度快,适合加密大量数据。RSA&#xff1…

Tina-Linux Bootloaer简述

Tina-Linux Bootloaer简述 目录介绍 ubuntuubuntu1804:~/tina-v2.0-sdk/lichee/brandy-2.0$ tree -L 1 . ├── build.sh ├── opensbi ├── spl //boot0 ├── spl-pub //boot0 ├── tools └── u-boot-2018 /ubootTina-Linux 启动流程简述

ant design pro v6 如何做好角色管理

先上图: 整个角色管理是如何做的吗? 首先你要处理后端,要先把角色存到用户那。 这是用户管理部分的内容: 可以看到一个用户是有多个角色的。 看到没有,存的是数组 数组的是一个 role 对象 role 对象是这样&#xf…

reactive 和 ref 的区别和联系

在 Vue3 的组合式 API (Composition API)中,ref 和 reactive 是用于创建响应式数据的两个核心函数。尽管二者都用于实现响应式数据,但在使用方式和适用场景上存在一些区别。 1. 基本概念 1.1 ref 用途:用于定义 基本…

深入探讨视频美颜SDK:直播美颜工具的核心技术与实现

本篇文章,笔者将深入探讨视频美颜SDK的核心技术及其在直播美颜工具中的实现。 一、视频美颜SDK的核心技术 视频美颜SDK通过一系列复杂的算法和技术,实时处理视频流并应用各种美颜效果。这些核心技术主要包括以下几个方面: 1.人脸识别与追踪…

【Hot100】LeetCode—24. 两两交换链表中的节点

目录 1- 思路四指针 2- 实现⭐24. 两两交换链表中的节点——题解思路 3- ACM 实现 原题连接:24. 两两交换链表中的节点 1- 思路 四指针 定义 dummyHead:便于处理头结点① cur 指针,记录两个交换节点的前 前一个结点② 第一个指针 first③ 第…

嵌入式开发--STM32G030C8T6,写片上FLASH死机CFGBSY和写入出错

故障现象1 G0系列,写片上FLASH时,经常死机,而且按复位键都没用,属于不断电都救不回来的那种死法。这种情况一般是由硬件置位了某个标志导致,只有断电才能故障复原。 故障查找 检查FLASH的相关寄存器,发现…

【秋招笔试】8.18大疆秋招(第一套)-后端岗

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

树莓派Pico C/C++ 开发环境搭建(一键完成版)

树莓派Pico C/C 开发环境搭建(一键完成版) 因为之前使用过MicroPython开发过树莓派Pico,总觉得用起来怪怪的。正好最近树莓怕发布了新一代的MCU——RP2350,之前的RP2040在各个平台都有所降价,因此,买了几块。同时因为之前是玩stm…

【系统架构设计】系统分析与设计方法

【系统架构设计】系统分析与设计方法 定义问题与归结模型问题分析因果鱼骨图 帕累托图上下文范围图 问题定义 需求分析与软件设计结构化分析与设计结构化分析DFD数据字典技术 结构化设计结构图程序流程图和盒图 模块设计 面向对象的分析与设计用户界面设计 定义问题与归结模型…

Eureka 原理与实践全攻略

一、Eureka 概述 Eureka 在微服务架构中具有举足轻重的地位。它作为服务注册与发现的核心组件,为分布式系统中的服务管理提供了关键支持。 Eureka 的主要功能包括服务注册、服务发现、服务健康监测和自我保护机制。服务注册功能使得服务提供者能够在启动时将自身的…

Linux安装配置docker,k8s

1.linux虚拟机初始配置 详情操作见下,具体操作需要注意 1.网络模式选择 NAT模式(对应第8点) 2.不用选择安装 GUI图形界面 (对应19点-5) 3.分区非必须操作 可以不分区(对应20点) 4.打开网络开关 (对应23点) CentOS 7安装教程&#xff…

利用GPTs,打造你的专属AI聊天机器人

在2023年11月的「OpenAI Devday」大会上,OpenAI再度带来了一系列令人瞩目的新功能,其中ChatGPT方面的突破尤为引人关注。而GPTs的亮相,不仅标志着个性化AI时代的到来,更为开发者和普通用户提供了前所未有的便利。接下来&#xff0…

C语言-部分字符串函数详解 1-4

C语言-部分字符串函数详解 1-4 前言1.strlen1.1基本用法1.2注意事项\0size_t 1.3模拟实现 2.strcpy2.1基本用法2.2注意事项**源字符串必须以 \0 结束****会将源字符串中的 \0拷贝到目标空间****目标空间必须可修改****目标空间必须能容纳下源字符串的内容** 2.3模拟实现 3.strn…

ES 模糊查询 wildcard 的替代方案探索

一、Wildcard 概述 Wildcard 是一种支持通配符的模糊检索方式。在 Elasticsearch 中,它使用星号 * 代表零个或多个字符,问号 ? 代表单个字符。 其使用方式多样,例如可以通过 {"wildcard": {"field_name": "value&…

【数据结构】关于冒泡排序,选择排序,插入排序,希尔排序,堆排序你到底了解多少???(超详解)

前言: 🌟🌟Hello家人们,这期讲解排序算法的原理,希望你能帮到屏幕前的你。 🌈上期博客在这里:http://t.csdnimg.cn/I1Ssq 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-C…

RK3568平台开发系列讲解(PWM篇)PWM的使用

文章目录 一、什么是PWM二、RK3568 PWM2.1、PWM 通道与引脚2.2、PWM 简介2.3、PWM 设备节点三、RK3568 PWM 调试节点📢 PWM 是很常用到功能,我们可以通过 PWM 来控制电机速度,也可以使用 PWM 来控制 LCD 的背光亮度。 一、什么是PWM PWM 全称是 Pulse Width Modulation,也…

XSS- - - DOM 破坏案例与靶场

目录 链接靶场: 第一关 Ma Spaghet 第二关 Jefff 第三关 Ugandan Knuckles 第四关 Ricardo Milos 第五关 Ah Thats Hawt 第六关 Ligma 第七关 Mafia 第八关 Ok, Boomer 链接靶场: XS…

SmartEDA崛起!揭秘其逐步取代Multisim与Proteus的四大颠覆性优势

在电子设计自动化(EDA)的浩瀚星空中,两款老牌软件——Multisim与Proteus,长久以来如同璀璨的双星,引领着电路仿真与设计的潮流。然而,近年来,一颗新星悄然升起,以其独特的魅力与强大…

《向量数据库 Faiss 搭建与使用全攻略》

一、Faiss 概述 Faiss 是由 Facebook AI 团队开发的一款强大工具,在大规模数据处理和相似性搜索领域占据着重要地位。 在当今信息爆炸的时代,数据规模呈指数级增长,如何从海量数据中快速准确地找到相似的数据成为了关键挑战。Faiss 应运而生…