如何优化MySQL三表联查mysql三表联查太慢

嘿,三重检查组合,这真的很烦人。
想一想,2 02 2 年,在我公司的系统中,用户数量一增加,查询就变慢,就像卡住了一样。
使用的是MySQL,一不小心数据库就会崩溃。

当时我很困惑。
经检查,数据量并不是特别大。
虽然只有几张桌子,但是上菜速度很慢。
查看日志,看到执行计划,哦,全表扫描,一个接一个。
那种感觉太可怕了。

后来我才意识到问题可能出在调查的配合上。
这三个表和相关字段排列不正确。
想一想,表1 与表2 相关,表2 与表3 相关。
如果中间字段没有索引,那么每个表都要遍历一遍,顺序不能错。
这是多么困难的事情啊。

所以第一步是使用索引。
表1 、表2 、表3 以及相关字段,例如id,必须建立索引。
不要想着避免麻烦而不建造任何东西。
建立索引后,查询时可以快速定位到数据库,直接找到想要的数据,不用一一慢慢查找。
这就像寻找一本书。
如果有索引,可以直接进入该页面。
如果没有目录,就得一页一页地翻。

让我们看这个例子,假设有三个表,table1 ,table2 ,table3 table1 和table2 通过id关联,table2 和table3 也通过id关联。
查询时必须写:
sql 选择 t1 .姓名、t2 .电话、t3 .地址 从表 1 t1 连接表 2 t2 ON t1 .id = t2 .id JOIN table3 t3 ON t2 .id = t3 .id;
看,这里,t1 与t2 相关,t2 与t3 相关。
如果t1 、t2 、t3 的id字段没有索引,那么数据库首先要在t1 中找到t2 对应的id,然后在t2 中找到t3 对应的id。
这非常慢。
如果id有索引,数据库会直接跳转到对应的位置,一闪就找到了。

第二个秘密是尽可能使用INNER JOIN。
这个东西非常有效。
INNER JOIN 仅返回两个表中的匹配行。
其他 JOIN,例如 LEFT JOIN 和 RIGHT JOIN,将返回所有行,包括不匹配的行,这将导致大量无用的工作。

第三个秘密是只检查必填字段。
不要检查所有字段,那是浪费。
仅检查您需要的内容,例如姓名、电话号码、地址等。
不要检查您不需要的列。
例如,如果您只需要姓名和电话号码,那么搜索时只需写这两个字段即可。

第四个秘密是消除不必要的子查询。
子查询有时可以解决问题,但有时只会造成更多混乱。
例如,在您的查询中,有一个子查询:
sql 选择 t1 .姓名、t2 .电话、t3 .地址 从表 1 t1 内连接 table2 t2 ON t1 .id = t2 .id INNER JOIN (SELECT id, address FROM table3 WHERE city = '纽约') t3 ON t1 .id =t3 .id;
这里,子查询是从table3 中获取id和地址。
但是你看,table3 和table1 是通过id关联起来的。
你不能只使用 ON t1 .id = t3 .id 吗?不需要子查询,代码会简单很多,效率也会更高。

第五步是安排。
应谨慎使用 ORDER BY。
它对结果进行排序并返回,这会消耗大量的时间和内存。
如果确实需要排序,最好对要排序的列建立索引,这样可以加快排序操作的速度。

例如,在你的查询中,如果需要按名称排序:
sql 选择 t1 .姓名、t2 .电话、t3 .地址 从表 1 t1 内连接 table2 t2 ON t1 .id = t2 .id 表 INNER JOIN3 t3 ON t1 .id = t3 .id 按 t1 .name 排序;
这里,我们使用name字段来对name字段进行排序和索引。

综上所述,MySQL的三表通用查询优化主要从以下几个方面入手:索引、INNER JOIN、查询列、子查询、排序。
具体优化取决于您的情况、数据量和需求。
我们不能一概而论,必须具体问题具体分析。
想想每个表包含多少数据以及每个字段的数据类型会影响优化效率。

也许我说的有点极端,但这是基于我当时的经验。
尝试一下,它可能对你有帮助。

MySQL中三表子查询的用法和实现方式mysql三表子查询

这是一个坑。
不要这样做。
直接使用JOIN和窗口函数。

到 2 02 3 年,由三表组成的子查询导致的查询时间超过 5 秒的百分比预计将达到 3 0%。

不要相信理论陈词滥调。
使用 JOIN 而不是子查询。

实用提醒:先写JOIN,再考虑子查询。

MySQL三表查询实现全连接查询mysql三表查询全连接

全连接查询被 UNION ALL 取代。
首先左连接然后右连接过滤NULL。
只需运行代码即可,不用担心。
请记住使用 DISTINCT 来删除重复项。