MySQL索引再认识

在最近的一次MySQL测试过程中,我的同事幺加明遇到了一些令人困惑的现象,这些现象超出了我们最初的预期。一直以来,我们在建立索引时,首要考虑的原则是在区分度大的字段上建立索引。然而,在实际测试中,我们发现区分度大的索引并不总是最佳选择,而是需要结合具体的使用场景进行深入分析。在幺加明的授权下,我将这个对比案例分享给大家,并再次向幺加明表示感谢。

首先,我们简要回顾一下MySQL的数据结构,具体可参考《ES 与 MySQL 在较大数据量下查询性能对比》这篇文章。

起初,我们只在content_id字段上创建了索引(idx_content_id),因为content_id的区分度最大,理论上在此索引上进行查询应该是速度最快的。然而,实际测试结果却让我们大跌眼镜:查询公开数据和部分不可见数据时,速度确实很快;但当查询部分可见数据时(例如content_id < 987872 AND user_id = 100),速度却非常慢,达到了612毫秒左右。如下:

经过深入分析,我们发现造成这一结果的主要原因是:虽然查询条件content_id < 987872能够快速定位到索引所在的叶子节点,但要想找到满足user_id = 100条件的数据,却需要进行大量的回表操作。这是因为我们的数据特性是:1.5亿条数据对应5000个用户,而user_id = 100只相当于取满足匹配条件数据中的五千分之一。这也解释了为什么查询user_id != 100的条件时能够快速返回结果,因为不等于100相当于取数据总量的五千分之四千九百九十九,所以可以快速匹配到数据。

基于以上分析,我们决定增加一个联合索引(idx_content_id_user_id),希望这样能够快速定位到user_id = 100的数据。

测试结果果然不负所望,查询时间提升到了244毫秒,比之前的612毫秒提升了2倍多。通过EXPLAIN语句查看执行计划,我们发现最主要的区别是扫描的行数(rows)大幅减少。

尽管uid的区分度不高,导致扫描的行数仍然较多,但由于是联合索引,至少减少了回表操作,所以查询速度得到了显著提升。然而,244毫秒的查询速度仍然不是很快。结合我们的数据特性,我们进一步思考:是否可以建立user_idcontent_id的联合索引(idx_user_id_content_id),以减少回表次数?

测试结果令人振奋:使用idx_user_id_content_id索引后,查询时间只需要6毫秒!这个结果非常令人满意。

综上所述,索引的建立并不是一件简单的事情,而是需要根据实际数据场景进行测试和分析,才能得到最优解。这个案例也再次提醒我们:在数据库优化方面,没有一成不变的规则,只有不断尝试和实践才能找到最适合自己的解决方案。

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

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

相关文章

SQL靶场第一关

打开sql靶场 一.判断注入类型 在网址输入?id1&#xff0c;页面正常回显 我们在输入?id1,页面报错&#xff0c;说明存在sql注入 我们再输入?id1 and 11--&#xff0c;页面正常回显 我们在输入?id1 and 12--&#xff0c;页面没有回显 这里我们知道了是字符型注入 为什么是…

ollama运行qwen2.5-coder:7b

1.linux安装 curl -fsSL https://ollama.com/install.sh | sh ollama serve # 启动ollama ollama create # 从模型文件创建模型 ollama show # 显示模型信息 ollama run # 运行模型&#xff0c;会先自动下载模型 ollama pull # 从注册仓库中拉取模…

牛客——打印日期,日期累加(C++)

目录 1.日期累加 1.1题目描述 1.2思路 1.3 2.打印日期 2.1题目描述 2.2思路 2.3代码 1.日期累加 1.1题目描述 计算一个日期加上若干天后是什么日期。输入第一行表示样例个数m&#xff0c;接下来m行每行四个整数分别表示年月日和累加的天数。输出m行&#xff0c;每行按…

Stylus 浏览器扩展开发-Cursor AI辅助

项目起源 作为一个经常需要长时间盯着屏幕的开发者&#xff0c;我一直在寻找一个简单的方法来保护眼睛。最初的想法很简单&#xff1a;将网页背景色替换成护眼的豆沙绿。虽然市面上已经有类似的扩展&#xff0c;但我想要一个更加轻量且可定制的解决方案。 这个简单的需求逐渐…

AD20 原理图库和PCB库添加

一 点击右下角 二 点击Components 三 点击File-based Libraries Preferences 四 最后点击安装即可

微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算

微信小程序uni-appvue3实现局部上下拉刷新和scroll-view动态高度计算 前言 在uni-appvue3项目开发中,经常需要实现列表的局部上下拉刷新功能。由于网上相关教程较少且比较零散,本文将详细介绍如何使用scroll-view组件实现这一功能,包括动态高度计算、下拉刷新、上拉加载等完整…

针对边缘计算优化LoRa的TinyML信道跳变管道

论文标题&#xff1a;Optimizing LoRa for Edge Computing with TinyML Pipeline for Channel Hopping&#xff08;针对边缘计算优化LoRa的TinyML信道跳变管道&#xff09; 作者信息&#xff1a;Marla Grunewald, Mounir Bensalem 和 Admela Jukan&#xff0c;来自德国布伦瑞克…

Linux-USB驱动实验

USB 是很常用的接口&#xff0c;目前大多数的设备都是 USB 接口的&#xff0c;比如鼠标、键盘、USB 摄像头等&#xff0c;我们在实际开发中也常常遇到 USB 接口的设备&#xff0c;本章我们就来学习一下如何使能 Linux内核自带的 USB 驱动。注意&#xff01;本章并不讲解具体的 …

操作系统文件管理相关习题2

文件管理的任务和功能文件管理 任务&#xff1a;对用户文件和系统文件进行组织管理&#xff0c;以方便用户使用&#xff0c;并保证文件的安全 功能&#xff1a;文件存储空间的管理&#xff0c;目录管理&#xff0c;文件读写管理和保护 目录管理 对目录管理的要求 实现按名存…

MYSQL - 索引详解

一 什么是索引&#xff1f; 实际上在上一篇介绍MYSQL的体系结构当中我们稍微提及了一点&#xff0c;在引擎层&#xff0c;我们提到不同的引擎对应的索引的实现方式&#xff0c;选择是不一样的。 简单理解&#xff0c;索引&#xff08;index&#xff09;其实就是一种帮助MYSQL高…

AI智能体Prompt预设词指令大全+GPTs应用使用

AI智能体使用指南 直接复制在AI工具助手中使用&#xff08;提问前&#xff09; 可前往SparkAi系统用户官网进行直接使用 SparkAI系统介绍文档&#xff1a;Docs 常见AI智能体GPTs应用大全在线使用 自定义添加制作AI智能体进行使用&#xff1a; 文章润色器 你是一位具有敏锐洞察…

el-tree树形结构拖拽层级错乱问题

背景: 项目中有个文件夹树形菜单,并且各级菜单中的子级元素是可以任意拖拽的,也就是树形结构拖拽修改分组。 问题分析&#xff1a; 出现拖拽层级错乱的问题&#xff0c;这通常意味着在进行节点拖拽操作后&#xff0c;树的层级关系没有正确地被维护。这可能是因为在更新节点位…

线程和进程(juc)

线程 一&#xff1a;概念辨析 1&#xff1a;线程与进程 进程&#xff1a; 1&#xff1a;程序由指令和数据组成&#xff0c;指令要执行&#xff0c;数据要读写&#xff0c;就需要将指令加载给cpu&#xff0c;把数据加载到内存&#xff0c;同时程序运行时还会使用磁盘&#x…

Java基础集合(Map)

存储特点 以键值对的形式存储, 一个元素由两个值组成 键(K-key): 无序, 无下标, 元素不可重复 值(V-value): 无序, 无下标, 元素可以重复 常用实现类 HashMap JDK1.2 底层哈希表实现 线程不安全, 效率高 LinkedHashMap JDK1.2 是HashMap的子类, 底层哈希表实现 线程不安全…

NEXT开发应用质量建议与测试指南

随着鸿蒙原生开发如火如荼的进展&#xff0c;NEXT对应用的质量提出了更高的要求。 NEXT的应用质量分为2个部分内容&#xff1a; ⚫ 体验质量&#xff1a; 功能数据完备、基础体验、HarmonyOS特征增强体验 ⚫ 内容合规&#xff1a; 资质、内容、广告、付费、开发者行为等 单元测…

java应用cpu占用过高故障排除

首先一定要清楚&#xff1a;java应用造成cpu过高的主要原因 1&#xff1a;一般是线程一直处于可运行&#xff08;Runnable&#xff09;状态&#xff0c;通常这些线程在执行无阻塞操作、循环、正则或纯粹的计算等任务 2&#xff1a;另一个可能造成CPU高的原因是频繁GC&#xff…

CPU是如何执行任务的?

你清楚下面这几个问题吗&#xff1f; 有了内存&#xff0c;为什么还需要 CPU Cache&#xff1f; CPU 是怎么读写数据的&#xff1f; 如何让 CPU 能读取数据更快一些&#xff1f; CPU 伪共享是如何发生的&#xff1f;又该如何避免&#xff1f; CPU 是如何调度任务的&#x…

最短路径算法(Dijkstra算法 + Bellman-Ford 算法 + Floyd-Warshall算法)

最短路径算法 完整版万字原文见史上最全详解图数据结构 1. Dijkstra算法&#xff08;单源最短路径&#xff09;&#xff08;无负权边图&#xff09; 算法原理 1. Dijkstra 算法通过 贪心策略 计算从一个源顶点到其他所有 顶点的最短路径。2. 时间复杂度为 O(V^2)&#xff08…

pyqt6事件概要

例子&#xff1a; 利用qtdesigner建立闹钟 python代码 # 导入所需要的文件 from PyQt6.QtGui import QIcon, QPixmap from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QListWidgetItem from PyQt6 import uic from PyQt6.QtCore import Qt, QTime imp…

位运算符I^~

&运算&#xff1a;上下相等才是1&#xff0c;有一个不同就是0 |运算&#xff1a;只要有1返回的就是1 ^(亦或)运算&#xff1a;上下不同是1&#xff0c;相同是0 ~运算&#xff1a;非运算&#xff0c;与数据全相反 cpu核心运算原理&#xff0c;四种cpu底层小电路 例&#xf…