gpt4 book ai didi

Mysql子查询优化?

转载 作者:行者123 更新时间:2023-11-30 00:13:32 25 4
gpt4 key购买 nike

我可以以任何不同的方式使用此代码来获得更好的性能吗?

我尝试过这种方式;

SELECT K.id, M.m_id, K.Sil, K.Banli, K.Foto, K.KullaniciAdi, K.Ad, K.Soyad, K.Gender,
(select rate_id,Rate,Zaman from ratings where UyeID=K.id ORDER BY rate_id DESC LIMIT 1)

但我不能做我想做的事。

这是工作代码。给出我想要的结果:

SELECT K.id, M.m_id, K.Sil, K.Banli, K.Foto, K.KullaniciAdi, K.Ad, K.Soyad, K.Gender,
( SELECT R.mr_id FROM mesajlarreply R
WHERE R.CID=M.m_id
ORDER BY R.mr_id DESC LIMIT 1
) as mr_id,
( SELECT R.Mesaj FROM mesajlarreply R
WHERE R.CID=M.m_id
ORDER BY R.mr_id DESC LIMIT 1
) as Mesaj,
( SELECT R.KayitZaman FROM mesajlarreply R
WHERE R.CID=M.m_id
ORDER BY R.mr_id DESC LIMIT 1
) as KayitZaman
FROM mesajlar M, kullanicilar K
WHERE
CASE
WHEN M.K1 = '1' THEN M.K2 = K.id
WHEN M.K2 = '1' THEN M.K1 = K.id
END
AND ( M.K1 = '1' OR M.K2 = '1' )
ORDER BY M.m_id DESC
LIMIT 20

最佳答案

假设子查询的顺序应该相同(不是拼写错误),那么三者的组合是 问题。 MySQL对此有几个现有的解决方案,如果每个组的行数很小,我想我更喜欢this answer中的样式。 ,对于您的情况,它看起来像这样:

SELECT rToUse.mr_id, rToUse.mesaj, rToUse.kayitZaman
FROM Mesajlarreply rToUse
LEFT JOIN Mesajlarreply rKnockout
ON rKnockout.cId = rToUse.cId AND rToUse.mr_id < rKnockout.mr_id
WHERE rKnockout.mr_id IS NULL

(这是有效的,因为当连接行时,具有最大 mr_id 的行没有匹配项。由于 rKnockout.mr_id IS NULL 为 true,所有其他行都将被丢弃)
事实上,您使用三个子查询可能会在系统上执行一些操作。

您的CASE语句计算为一组简单的 bool 条件:

(M.k1 = '1' AND M.k2 = K.id) OR (M.k1 <> '1' AND M.k2 = '1' AND M.k1 = K.id)

...我假设您没有两者 k1 的情况 k2等于'1'同时,所以M.k1 <> '1' (这是为了保留 CASE 的语义,如果为真)将是不必要的。请注意OR这仍然可能是一个性能痛点。此外,如果这些列中的任何一个实际上是某种数字类型,则连接将首先需要转换,这可能会降低性能。

所以,我可能会首先编写这样的查询:

SELECT K.id, M.m_id, K.sil, K.banli, K.foto, K.kullaniciAdi, K.ad, K.soyad, K.gender,
R.mr_id, r.mesaj, r.kayitZaman
FROM Mesajlar M
JOIN Kullanicilar K
ON (M.k1 = '1' AND M.k2 = K.id)
OR (M.k2 = '1' AND M.k1 = K.id)
LEFT JOIN (SELECT rToUse.cId, rToUse.mr_id, rToUse.mesaj, rToUse.kayitZaman
FROM Mesajlarreply rToUse
LEFT JOIN Mesajlarreply rKnockout
ON rKnockout.cId = rToUse.cId
AND rToUse.mr_id < rKnockout.mr_id
WHERE rKnockout.mr_id IS NULL) R
ON R.cId = M.m_id
ORDER BY M.m_id DESC
LIMIT 20

(当然未经测试 - 没有提供数据集)
我用过 LEFT JOIN让子查询保留给定的数据语义。如果您有所有情况的行(或只关心那些有的行),则可以将其更改为 (INNER) JOIN 。根据数据集的布局方式(以及您拥有/不拥有哪些索引),这可能不会表现得更好,但这通常对优化器来说应该更友好。

关于Mysql子查询优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23851657/

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