【MySQL进阶之路】好友推荐系统索引设计实战

news2024/11/25 6:52:58

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!

在我后台回复 「资料」 可领取编程高频电子书
在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!

在这里插入图片描述

索引设计实战

接下来根据具体的项目场景来对索引设计进行讲解

在这里以社交网站中的查询推荐好友功能为例,作用主要是根据一些条件查询用户

1707579925850

首先,最基本的,需要根据省份、城市、性别、年龄、爱好、登录时间(7 天内登录)进行筛选,我们先将 SQL 语句中的 where 条件写出来:

where provience = 'xxx' and city = 'xxx' and sex = 'xx' and age >= 18 and age <= 30 and hobby in ('xx', 'xx') 
  • 索引设计的时机

注意在实际开发项目过程中,设计索引的时机其实并不是在建立数据库表之后就立即设置索引,而是等业务代码完成之后,再根据业务代码去设计索引,通过良好的索引设计让大多数查询都可以走索引!

那我们来看一下根据上边的 where 条件该来如何设计索引

  • 联合索引初始设计

首先,索引的设计原则中,建议不要将选择性比较低的列作为索引,比如性别,但是我们的查询条件中无法避免性别的查询,因此可以将选择性比较低的列(性别)放在联合索引中比较靠后的位置

那么对查询推荐好友来说,基本都需要带上 provience、city、sex 三个列作为条件,因此设计的联合索引中,可以将这 3 个列放在比较靠前的位置,可以更好的遵循最左前缀原则,避免索引失效

因此,先将联合索引设置为:(provience, city, sex)

  • age 列索引优化

接下来需要对年龄进行查询,而在索引规则中,如果有一个字段使用了范围查询,那么该字段后边的列就不会走索引了,所以一定要将范围查询的列放在索引的最后边

因此 SQL 语句和联合索引都需要进行优化,在 SQL 语句中,将 age 列的范围查询向后移,如下:

where provience = 'xxx' and city = 'xxx' and sex = 'xx' and hobby in ('xx', 'xx') and age >= 18 and age <= 30

联合索引设置为:(provience, city, sex, hobby, age)

  • 对 7 天内登录用户的索引优化

接下来,在 SQL 中加上对登陆时间在 7 天以内的用户进行查询的,表中肯定有一个字段 last_login_time,要判断是否 7 天内登录,可以判断 last_login_time 是否大于(当前时间 - 7 天),那么就要进行函数计算,将当前时间减去七天,但是如果使用了函数计算,就无法走索引了,那么怎么办呢?

-- 这里 login_time 应该大于等于 7 天前的时间,这里使用伪代码来写了
where provience = 'xxx' and city = 'xxx' and sex = 'xx' and hobby in ('xx', 'xx') and age >= 18 and age <= 30 and login_time >= (current_time - 7days)

从 SQL 语句的角度来看,这个问题是无法解决了,但是可以从业务的角度来让这个字段走上索引

我们可以给表中单独增加一个字段 last_login_in_7_days 表示该用户在 7 天内是否登录,如果登录了值为 1,否则值为 0,这样判断用户 7 天内是否登录就可以走索引了

联合索引设置为:(provience, city, sex, hobby, last_login_in_7_days, age)

  • 对 sex 索引列优化

假设,在查询的时候,没有对 sex 列进行条件查询,那么就会导致不符合最左前缀原则,从而导致 sex 后边的索引都无法使用,这种情况下该怎么办呢?

我们可以通过修改 SQL 语句来解决这个问题,如果不根据 sex 进行筛选,那就通过 in 语句,让 sex 列所有的枚举值都在 in 语句的条件中,让 SQL 可以走 sex 这一列的索引

where provience = 'xxx' and city = 'xxx' and sex in ('male', 'female') and hobby in ('xx', 'xx') and last_login_in_7_days = 1 and age >= 18 and age <= 30 

这种优化方式不仅针对于 sex 列可以使用,而且针对爱好 hobby 列也可以使用,只要将所有枚举值拿到,再加上 in 语句就可以实现

  • 使用辅助索引对其他少数查询进行优化

那么通过上边的联合索引 (provience, city, sex, hobby, last_login_in_7_days, age) 就可以抗下平常 80% 的查询了,那么还有剩下的 20% 查询,是不符合普遍情况的

比如只根据性别查询,并且根据用户评分进行排序,这其中涉及的 2 个字段为:sex、score

where sex = 'female' order by score

像这种情况的查询,是无法走我们上边设计的联合索引的(不符合最左前缀原则),通过 sex 进行筛选,会导致筛选之后还会有很多数据,如果不走索引的话进行磁盘排序,会导致性能很差,因此可以再设计辅助索引,让 order by 可以走 score 列的索引,使用索引排序,速度相比于不使用索引排序更快,因此对于这 20% 的非常规查询,可以设置辅助索引来应对!

比如,设计辅助索引为:(sex, score) ,通过 sex 进行过滤,之后根据 score 进行排序,可以通过索引进行排序,相比于不适用索引,性能提升很多!

1707580068909

总结一下,通过索引实战,可以看出大部分的查询都是比较常规的,我们可以去设计一个联合索引来覆盖到 80% 的查询,而对于非常规的 20% 的查询,可以通过设计一些辅助索引来优化性能!

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

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

相关文章

ADSelfService Plus发布离线MFA功能,强化远程工作安全性

ManageEngine ADSelfService Plus推出离线多因素身份验证&#xff0c;提升远程工作安全性确保通过先进的验证方法对企业数据进行授权访问&#xff0c;无论时间、地点或连接问题如何允许远程用户安全进行身份验证&#xff0c;即使未连接到认证服务器或互联网使用高度安全的基于T…

###C语言程序设计-----C语言学习(12)#进制间转换,十进制,二进制,八进制,十六进制

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 计算机处理的所有信息都以二进制形式表示&#xff0c;即数据的存储和计算都采…

协议-TCP协议-基础概念04-可能发生丢包的位置-linux配置项梳理(TCP连接的建立和断开、收发包过程)

可能发生丢包的位置-linux配置项梳理&#xff08;TCP连接的建立和断开、收发包过程&#xff09;-SYN Flood攻击和防御原理 参考来源&#xff1a; 极客时间-Linux性能优化实战 极客时间-Linux内核技术实战课 到底是哪里发生了丢包呢&#xff1f; Linux 的网络收发流程 从图中…

【java】12:封装

面向对象编程三大特征 1.基本介绍 面向对象编程有三大特征&#xff1a;封装、继承和多态。 2.封装介绍 封装(encapsulation)就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起&#xff0c;数据被保护在内部&#xff0c;程序的其它部分只有通过被授权的操作[方法]&am…

3秒实现无痛基于Stable Diffusion WebUI安装ComfyUI!无需重复安装环境!无需重复下载模型!安装教程

标题略有夸张的表达了接下来这一套确实很简单&#xff0c;相较于直接下载或者通过秋叶包更新而言。大大节省磁盘空间&#xff0c;和下载时间。 这篇教程不需要你有&#xff1a; 代码基础。都是复制粘贴就完事。魔法。 这篇教程默认你已经有&#xff1a; 1. 本地能够正常使用…

python+flask+django农产品供销展销电子商务系统lkw43

供销社农产品展销系统的设计与实现&#xff0c;最主要的是满足使用者的使用需求&#xff0c;并且可以向使用者提供一些与系统配套的服务。本篇论文主要从实际出发&#xff0c;采用以对象为设计重点的设计方法&#xff0c;因此在进行系统总体的需求分时借助用例图可以更好的阐述…

Ainx-V0.2-简单的连接封装与业务绑定

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于Ainx系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列…

MySQL(基础)

第01章_数据库概述 1. 为什么要使用数据库 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。大多数情况下&#xff0c;特别是企业级应用&#xff0c;数据持久化意味着将内存中的数据保存到硬盘上加以”固化”&#xff0c;而持久化的实现过程大多…

汽车出租管理系统

文章目录 汽车出租管理系统一、系统演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 汽车出租管理系统 一、系统演示 汽车租赁系统 二、项目介绍 语言&#xff1a;java 框架&#xff1a;SpringBoot、…

C#使用重载方法实现不同类型数据的计算

目录 一、涉及到的相关知识 1.重载的方法 2.Convert.ToInt32(String)方法 3.判断字符串是否带有小数点 二、实例 1.示例 2.生成成果 一、涉及到的相关知识 1.重载的方法 重载方法就是方法名称相同&#xff0c;但是每个方法中参数的数据类型、个数或顺序不同的方法。如果…

腾讯云4核8G服务器可以用来干嘛?怎么收费?

腾讯云4核8G服务器适合做什么&#xff1f;搭建网站博客、企业官网、小程序、小游戏后端服务器、电商应用、云盘和图床等均可以&#xff0c;腾讯云4核8G服务器可以选择轻量应用服务器4核8G12M或云服务器CVM&#xff0c;轻量服务器和标准型CVM服务器性能是差不多的&#xff0c;轻…

云安全的基本概念(基本目标与指导方针)

目录 一、云安全概念概述 1.1 概述 二、云安全的基本目标 2.1 安全策略开发模型 2.1.1 信息安全三元组 2.1.1.1 保密性(Confidentiality) 2.1.1.2 完整性(Integrity) 2.1.1.3 可用性(Availability) 2.1.2 信息安全三元组的局限性 2.2 其他信息安全属性 2.2.1 真实性 …

CTFshow-WEB入门-信息搜集

web1&#xff08;查看注释1&#xff09; wp 右键查看源代码即可找到flag web2&#xff08;查看注释2&#xff09; wp 【CtrlU】快捷键查看源代码即可找到flag web3&#xff08;抓包与重发包&#xff09; wp 抓包后重新发包&#xff0c;在响应包中找到flag web4&#xff08;robo…

服务器解析漏洞及任意文件下载

1.服务器文件解析漏洞 文件解析漏洞,是指Web容器&#xff08;Apache、nginx、iis等&#xff09;在解析文件时出现了漏洞,以其他格式执行出脚本格式的效果。从而,黑客可以利用该漏洞实现非法文件的解析。 &#xff08;1) Apache linux系统中的apache的php配置文件在/etc/apac…

PyTorch深度学习实战(26)——多对象实例分割

PyTorch深度学习实战&#xff08;26&#xff09;——多对象实例分割 0. 前言1. 获取并准备数据2. 使用 Detectron2 训练实例分割模型3. 对新图像进行推断小结系列链接 0. 前言 我们已经学习了多种图像分割算法&#xff0c;在本节中&#xff0c;我们将学习如何使用 Detectron2 …

openssl3.2 - osslsigncode工程的学习

文章目录 openssl3.2 - osslsigncode工程的学习概述笔记工程库地址工程的编译osslsigncodeM工程文件列表osslsigncodeM工程搭建细节原始工程实现的改动自己封装的包含openssl和curl的实现osslsigncodeM工程命令行的用法备注学学作者怎么对签好的PE进行验签(code sgin)END opens…

视觉开发板—K210自学笔记(二)

视觉开发板—K210 一、开发之前的准备 工欲善其事必先利其器。各位同学先下载下面的手册&#xff1a; 1.Sipeed-Maix-Bit 资料下载&#xff1a;https://dl.sipeed.com/shareURL/MAIX/HDK/Sipeed-Maix-Bit/Maix-Bit_V2.0_with_MEMS_microphone 2.Sipeed-Maix-Bit 规格书下载&…

c语言求多边形面积

多边形有现成的面积公式&#xff0c;直接套用即可。area函数接受两个参数&#xff1a;顶点坐标&#xff0c;顶点个数。 #include <stdio.h> #include <math.h>struct point {int x;int y; };float area(point p[], int n) {int i;float sum 0.0;for (i 0; i <…

专业140+总分410+华南理工大学811信号与系统考研经验华工电子信息与通信,真题,大纲,参考书。

23考研已经落幕&#xff0c;我也成功的上岸华工&#xff0c;回首这一年多的历程&#xff0c;也是有一些经验想和大家分享一下。 首先说一下个人情况&#xff0c;本科211&#xff0c;初试成绩400分。专业课140。 整体时间安排 对于考研&#xff0c;很重要的一环就是时间安排&…

《Python 网络爬虫简易速速上手小册》第10章:未来展望与新兴技术(2024 最新版)

文章目录 10.1 机器学习在爬虫中的应用10.1.1 重点基础知识讲解10.1.2 重点案例&#xff1a;使用机器学习进行自动化内容抽取10.1.3 拓展案例 1&#xff1a;利用深度学习识别复杂的网页结构10.1.4 拓展案例 2&#xff1a;机器学习辅助的动态反反爬虫策略 10.2 处理 JavaScript …