gpt4 book ai didi

mysql - 解释 SQL 和查询优化

转载 作者:行者123 更新时间:2023-11-29 01:24:23 25 4
gpt4 key购买 nike

Explain SQL

解释一个耗时超过 5 秒的查询的 SQL(在 phpmyadmin 中)给了我上面的内容。我读到我们可以研究解释 SQL 来优化查询。谁能告诉我这个解释 SQL 是否告诉了这样的事情吗?

谢谢大家。

编辑:

查询本身:

SELECT 
a.`depart` , a.user,
m.civ, m.prenom, m.nom,
CAST( GROUP_CONCAT( DISTINCT concat( c.id, '~', c.prenom, ' ', c.nom ) ) AS char ) AS coordinateur,
z.dr
FROM `0_activite` AS a
JOIN `0_member` AS m ON a.user = m.id
LEFT JOIN `0_depart` AS d ON ( m.depart = d.depart AND d.rank = 'mod' AND d.user_sec =2 )
LEFT JOIN `0_member` AS c ON d.user_id = c.id
LEFT JOIN `zone_base` AS z ON m.depart = z.deprt_num
GROUP BY a.user

编辑2:

两个表ad的结构Table structures 。顶部:a 底部:d

编辑3:

我想在这个查询中得到什么?

我首先想从表0_activite中获取'depart'和'user'(这是一个id)的值。接下来,我想从 0_member 获取人名(civ、prenom 和 name),我通过“user”从 0_activite 获取其 id,通过匹配 0_activite.user 和 0_member.id。这里department缺少department,它也是一个id。

所以此时,我从两个表 0_activite0_member 中获取了一个人的离开、id、civ、nom 和 prenom。

接下来,我想知道哪个博士与此出发有关,这是我从 zone_base 获得的。 0_activite0_member中的delete值相同。

然后是更棘手的部分。 0_member 中的一个人可以与多个出发相关联,这存储在 0_depart 中。此外,每个用户都有一个级别,其中之一是“mod”,代表主持人。现在我想获取与第一个用户所在位置不同的所有版主,然后再次从 0_member 中获取这些版主的姓名。我还有一个变量 user_sec,但这在这种情况下可能不太重要,尽管我不能忽视它。

这就是查询变得棘手的原因。 0_member 存储 id、用户名、+ 1 个出发,0_depart 存储用户的所有出发,每个出发一行,0_activite 存储一些其他内容,我想通过 userid 关联这些内容0_activite 以及其余的。

希望我已经说清楚了。如果不是,请告诉我,我将再次尝试编辑这篇文章。

再次非常感谢。

最佳答案

除了这里其他人提供的几个答案之外,它可能有助于更好地理解查询中的“我想要什么”。由于您在另一个问题中接受了我最近的回答,因此您已按部门信息应用了过滤器。

您的查询正在 Department 表中按rank = 'mod' 和 user_sec = 2 执行 LEFT 连接。您的总体意图是显示 0_activite 表中的所有记录,而不管与 0_Depart 表的有效连接...以及如果 0_Depart 表存在匹配项,您只关心“mod”和 2 值?

如果您只关心那些与带有“mod”和 2 个条件的 0_depart 特别关联的人,我会首先从该表开始反转查询,然后加入其余的。

通过关系或条件在表上拥有键始终会带来性能优势(与没有索引相比)。

首先使用最小的集合开始查询,然后加入其他表。

从你的问题的澄清开始...我将从最内部开始...它是谁以及他们与哪些部门相关...然后让主持人(来自条件所在的部门)...然后得到实际主持人的姓名信息...最后根据主持人的部门发送到您的 zone_base 中的博士...

select STRAIGHT_JOIN
DeptPerMember.*
Moderator.Civ as ModCiv,
Moderator.Prenom as ModPrenom,
Moderator.Nom as ModNom,
z.dr
from
( select
m.ID,
m.Depart,
m.Civ,
m.Prenom,
m.Nom
from
0_Activite as a
join 0_member m
on a.User = m.ID
join 0_Depart as d
on m.depart = d.depart ) DeptPerMember

join 0_Depart as DeptForMod
on DeptPerMember.Depart = DeptForMod.Depart
and DeptForMod.rank = 'mod'
and DeptForMod.user_sec = 2

join 0_Member as Moderator
on DeptForMod.user_id = Moderator.ID

join zone_base z
on Moderator.depart = z.deprt_num

请注意我如何对查询进行分层以获取每个部分并连接到下一个、下一个和下一个。我正在根据先前的结果构建链,并使用清晰的“别名”引用来澄清内容。现在,您可以通过其不同的“别名”引用从任何级别获取任何相应元素...

关于mysql - 解释 SQL 和查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6181178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com