MySQL详细讲解如何优化查询条件
前言
技术能解决的都变成技术了
技术解决不了的是需求
状态
假设我们目前有两个表
业务表书(t_a_book)阅读历史表(t_r_book_history)用户表
它的两个表数据逻辑如下
t_a_book
t_r_book_history
t_a_user
当然,我们假设当前的数据量不仅仅是我们眼前看到的数据,而是网上的真实情况。
每张桌子至少开始10w+
问题 1
这时候模糊查询是什么意思,我们需要面对第一个业务问题,
我们需要做一个报表,显示用户阅读书籍的记录,并显示用户名、用户号、书名
此时我们如何设计查询SQL
多表连接查询
p>
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;
查询的结果是
逻辑是
单表查询
如果此时我们选择简化复杂度,使用单表查询方式查询数据,其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 ();
数据逻辑与多表联合查询一致,唯一不同的是需要查询3次
结论
我们可以看一下,目前两种查询方式的逻辑。
主要流量压力在表t_r_book_history
当数据量很大时,我们只需要根据release_time进行索引,就可以简化这一步的操作。
主键可以用来简化后面的操作
从这个角度来看,这两种说法在本质上并没有明显的区别
问题 2
现在我们需要添加两个查询条件
如果这个时候,我们怎么写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
修改这两个查询条件,将这个无法解决的问题变成解决方案
但是,有人说我们是技术。我想不出产品,
但我想说,你以后查卡半分钟的时候要说,说服大家这事不关我的事
或者说,在产品开发之前说服产品
关于如何在MySQL中优化查询条件的文章介绍到此为止。更多相关MySQL查询条件,请搜索编程宝库之前的文章,希望以后支持编程宝库。 !
下一节:Mysq详细讲解如何解决库存并发MySQL教程
面临的问题 长话短说,假设我们面临以下需求商品,库存有 2000 件,直到售完为止。今天的卖货只允许卖100。如何执行我提出的方案也很简单,采用乐观锁定的方法。以下是具体计划——...