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

欢迎关注公众号(通过文章导读关注:【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.hqwc.cn/news/465616.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware虚拟机安装openEuler系统(二)(2024)

下面我们进行openEuler系统的一些简单配置。 1. 开启openEuler系统 在VMware Workstation Pro虚拟机软件中找到安装好的openEuler操作系统虚拟机并开启。 等待开启。 2. 安装配置 进入后选择第一个“Install openEuler 20.03-LTS”。 3. 选择系统语言 为虚拟机设置系统语言…

《统计学简易速速上手小册》第5章:回归分析(2024 最新版)

文章目录 5.1 线性回归基础5.1.1 基础知识5.1.2 主要案例&#xff1a;员工薪资预测5.1.3 拓展案例 1&#xff1a;广告支出与销售额关系5.1.4 拓展案例 2&#xff1a;房价与多个因素的关系 5.2 多元回归分析5.2.1 基础知识5.2.2 主要案例&#xff1a;企业收益与多因素关系分析5.…

【数学建模】【2024年】【第40届】【MCM/ICM】【D题 五大湖的水位控制问题】【解题思路】

一、题目 &#xff08;一&#xff09; 赛题原文 2024 ICM Problem D: Great Lakes Water Problem Background The Great Lakes of the United States and Canada are the largest group of freshwater lakes in the world. The five lakes and connecting waterways const…

Ajax+JSON学习一

AjaxJSON学习一 文章目录 前言一、Ajax简介1.1. Ajax基础1.2. 同源策略 二、Ajax的核心技术2.1. XMLHttpRequest 类2.2. open指定请求2.3. setRequestHeader 设置请求头2.4. send发送请求主体2.5. Ajax取得响应 总结 前言 一、Ajax简介 1.1. Ajax基础 Ajax 的全称是 Asynchron…

C++ dfs状态的表示(五十三)【第十三篇】

今天我们将来求解N皇后问题。 1.N皇后问题 N 皇后问题是一个经典的问题,在一个 NN 的棋盘上放置 N 个皇后,每行刚好放置一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。 上图就是一个合法的 8 皇后的解。 N 皇后问题是指:计算一共有多少种合法的…

游泳佩戴耳机会对耳朵有危害吗?什么样的耳机适合游泳时佩戴

游泳佩戴耳机会对耳朵造成危害吗&#xff1f;答案并不绝对&#xff0c;关键在于选择什么样的耳机。如果使用的是普通耳机或者防水性能不高的蓝牙耳机&#xff0c;在水中使用时&#xff0c;水可能会进入耳机内部&#xff0c;导致耳机损坏&#xff0c;甚至引发中耳炎等耳部疾病。…

MySQL-运维

一、日志 1.错误日志 错误日志是MySQL中最重要的日志之一&#xff0c;它记录了当mysql启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关性息。当数据库出现任何故障导致无法正常使用时&#xff0c;建议首先查看此日志。 该日志是默认开启的&#xf…

Linux---网络套接字

端口号 端口号 端口号是一个2字节16位的整数; 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理; IP地址 端口号能够标识网络上的某一台主机的某一个进程; 一个端口号只能被一个进程占用 在公网上&#xff0c;IP地址能表示唯一的一台主机&…

分享66个时间日期JS特效,总有一款适合您

分享66个时间日期JS特效&#xff0c;总有一款适合您 66个时间日期JS特效下载链接&#xff1a;https://pan.baidu.com/s/1niQUpDSs10gfGYKYnEgKRg?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;…

单片机学习笔记---AT24C02(I2C总线)

目录 有关储存器的介绍 存储器的简介 存储器简化模型 AT24C02介绍 AT24C02引脚及应用电路 I2C总线介绍 I2C电路规范 开漏输出模式和弱上拉模式 其中一个设备的内部结构 I2C通信是怎么实现的 I2C时序结构 起始条件和终止条件 发送一个字节 接收一个字节 发送应答…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月12日,星期一

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年2月12日 星期一 农历正月初三 1、 注意错峰出行&#xff01;今起全国公路网流量将处于高位运行状态。 2、 中国旅游研究院&#xff1a;预计2024年国内旅游人数或超60亿人次。 3、 阔别四年&#xff0c;北京、贵阳、张家…

指纹浏览器如何颠覆传统浏览器的使用?

传统浏览器在互联网时代发挥了巨大的作用&#xff0c;但随着科技的不断进步和用户需求的不断变化&#xff0c;新一代的浏览器工具开始崭露头角。指纹浏览器作为一种创新性的浏览器工具&#xff0c;正逐渐颠覆传统浏览器的使用方式。本文将探讨指纹浏览器如何颠覆传统浏览器&…