MySQL详解如何优化查询条件
作者:会喷火才能叫火山 发布时间:2024-01-26 06:52:05
前言
技术能解决的事情改技术
技术解决不了的事情该需求
现状
假设我们目前有两张表
业务表 书( t_a_book ) 阅读历史记录表 (t_r_book_history) 用户表
其两张表的数据逻辑如下
t_a_book
t_r_book_history
t_a_user
当然了,我们假设当前的数据量并不只是我们眼前看到的这几条数据,而是线上真实情况。
每张表至少都是10w+起步
问题一
这时候,我们需要面临第一个业务问题,
我们需要做一个报表,显示用户阅读图书的记录,并显示用户名,用户号,书名
这时候我们如何设计查询SQL
多表联查
SELECT * FROM t_r_book_history bh
LEFT JOIN t_a_user u ON bh.user_id = u.id
LEFT JOIN t_a_book b ON bh.book_id = b.id
WHERE
bh.record_flag = 1
ORDER BY bh.release_time DESC LIMIT 10;
查询出来的结果为
其逻辑为
数据库根据release_time倒序查询数据表,取出倒序的数据
根据左连接获取 用户信息
根据左连接获取 图书信息
单表查询
如果此时我们选择化繁为简,使用单表的查询方法,来查询数据其SQL为
SELECT * FROM t_r_book_history bh
WHERE
bh.record_flag = 1
ORDER BY bh.release_time DESC LIMIT 10;
// 用户信息
SELECT * FROM t_a_user u WHERE u.id IN ();
// 图书信息
SELECT * FROM t_a_books b WHERE u.id IN ();
其数据逻辑与多表联查一致,唯一不同的便是需要查询三次
结论
我们可以看,当前两种查询方式的逻辑来看。
主要会存在的流量压力在与 t_r_book_history 这张表上面
当数据量大的时候,我们只需要根据release_time 做索引,简化这一步的操作。
后续都可以使用主键来简化操作
由此来看,两个语句其实在本质上没有明显的快慢之分
问题二
现在我们需要增加两个查询条件
用户名称,支持模糊查询
书名信息,支持模糊查询
如果这时候,我们如何编写SQL
多表联查
如果我们使用多表联查的思路来填写SQL
SELECT * FROM t_r_book_history bh
LEFT JOIN t_a_user u ON bh.user_id = u.id
LEFT JOIN t_a_book b ON bh.book_id = b.id
WHERE
bh.record_flag = 1
AND
b.name like "四%"
and u.name like "张%"
ORDER BY bh.release_time DESC LIMIT 10;
显示的数据
其逻辑为
查询用户表,根据其用户名称进行模糊查询
查询书表,根据书名进行模糊查询
根据用户主键,书籍主键作为查询条件来进行查询
单表查询
SELECT * FROM t_a_user WHERE user_name LIKE "张%"
SELECT * FROM t_a_book WHERE user_name LIKE "四%"
SELECT * FROM t_r_book_history bh
WHERE
bh.record_flag = 1
ORDER BY bh.release_time DESC LIMIT 10;
// 用户信息
SELECT * FROM t_a_user u WHERE u.id IN ();
// 图书信息
SELECT * FROM t_a_books b WHERE u.id IN ();
其查询逻辑与多表联查一致
问题
现在主要的问题在于 , t_a_user , t_a_book , t_r_book_history 这三张表都是大表,
我们使用的查询条件也十分的模糊
简单的说 , 无论我们使用哪种方法, 都有可能会出现几十万个符合的结果
因此,我们无论使用哪种编写方法 , 这个SQL都是不可行的
如何解决
文章写到这里,我们会发现这个问题,已经不能停留再技术成面的问题。
因此,我们就只能修改需求
我们这里的问题 , 是这两张表的查询条件。他十分的模糊,我们无法将范围限制在几条,几十条,甚至几百条内。
既然这样,我们就只能跟需求方表示,这个查询条件必须使用十分“明确”的数据
例如对于用户,我们常常能用什么来明确指向一个用户呢?
id,数据主键,手机号码
我们如何确定一本书呢?我们可以用一个ISBN
修改这两个查询条件,才能将这个不能解决的问题,修改为解决
但是,有人说,我们是技术。不能对产品提这样的想法,
但是我想说,你是打算在将来来查询卡半分钟的时候说,说服所有人这个东西不关我的事
还是说,在未开发前说服产品
来源:https://blog.csdn.net/ArroGance_X/article/details/124868649


猜你喜欢
- 本文实例为大家分享了python实现UDP文件传输的具体代码,供大家参考,具体内容如下UDP协议下文件传输:服务端import socket
- Python 实现使用 dict 创建二维数据dict 的 keys、values 分别作为二维数据的两列In [16]: d = {1:&
- 昨天去面试,百度题果然不一样,笔试我就蒙了,现在能记住两道题,笔试:1、title和alt 区别2、三列布局 左边裂固定宽度左对齐,右边列固
- 常用目标检测模型基本都是读取的PASCAL VOC格式的标签,下面代码用于生成VOC格式的代码,根据需要修改即可:from lxml imp
- 1、Pandas库的操作Panda是数据分析特别重要的一个库,我们要掌握以下三点:· pandas 分组计算;· pandas 索引与多重索
- 前言:一个完整的 HTTP 请求,包括客户端向服务端发送的 Request 请求和服务器端发送的 Response 响应。为了能方便的访问获
- 前两天研究了一下textarea的直观行的换行规律,挺复杂啊:直观行怎样取不光要看cols大小,还要看网页编码方式。cols="3
- 如果只是想实现将jenkins的构建结果发送到企业微信进行通知,最简便的方式是安装Qy Wechat Notification Plugin
- 关于带权随机数为了帮助理解,先来看三类随机问题的对比:1.已有n条记录,从中选取m条记录,选取出来的记录前后顺序不管。实现思路:按行遍历所有
- 滚动页面在自动化操作中,如果web页面过长,而我们需要的元素并不在当前可视页面中,那么selenium就无法对其进行操作;此时,我们就需要像
- PHP的类是单一继承模式,也就是每个类只能继承一个父类(基类)。但有时需要引入更多通用(共用)的方法,同时这些方法又不适合集成到基类。那么这
- JavaScript substr 方法substr 方法用于根据开始位置和长度截取字符串并返回截取部分字符串。其语法如下:str_obje
- 在对列表的元素进行找寻时,会频繁的说到遍历的理念。对于复杂的遍历要求,如多个列表中查找就显然不适合用for循环。本篇所要带来的是zip()
- 此方法支持IE 不支持火狐。可能是因为FCKEidtor的keyup方法在火狐下不被支持。 FCKEditor编辑器换为TextBox,应该
- window.onload = function(){ var gaga = document.getElementById( "
- 目前数据预处理最常见的方法就是中心化和标准化。中心化相当于修正数据的中心位置,实现方法非常简单,就是在每个特征维度上减去对应的均值,最后得到
- 内容摘要:本文详细介绍了SQL Server导入导出数据的方法:(1)导出导入SQL Server里某个数据库,(2)导
- 我就废话不多说了,直接上代码吧!pip install pymysqlimport pymysqlimport pandas as pdco
- 前言“幸运牛牛套圈圈”套住欢乐,圈住幸福,等你来挑战!哈喽,大家上午好,我是你们的栗子同学,今天来给
- 在SQL Server数据库操作中,我们常常会用到存储过程对实现对查询的数据的分页处理,以方便浏览者的浏览。本文我们总结了五种SQL Ser