求助一个 SQL 优化

327 天前
 xuecat
SELECT a.* FROM `tblog` as a 
INNER JOIN `structroot` as b ON a.`ModID`=b.`ModuleID` AND a.`SrcGuid`=b.`DataGUID` 
INNER JOIN (SELECT * FROM `tblog` WHERE `ModID`=357 AND `ID`<2147483647 ORDER BY `ID` desc limit 100) as f ON f.`ModID`=b.`RootModuleID` AND f.`SrcGuid` = b.`RootDataGUID`
WHERE a.`ID`<2147483647
UNION ALL
(SELECT * FROM `tblog` WHERE `ModID`=357 AND `ID`<2147483647 ORDER BY `ID` desc limit 100)

如图,有括号的俩句实际都是一个查询。所以我想优化成一句 这是我想象的语法,但是就是跑不通,所以让大佬看看呢

SELECT a.* FROM `tblog` as a 
INNER JOIN `structroot` as b ON a.`ModID`=b.`ModuleID` AND a.`SrcGuid`=b.`DataGUID` 
INNER JOIN (SELECT * FROM `tblog` WHERE `ModID`=357 AND `ID`<2147483647 ORDER BY `ID` desc limit 100) as f ON f.`ModID`=b.`RootModuleID` AND f.`SrcGuid` = b.`RootDataGUID`
WHERE a.`ID`<2147483647
UNION ALL
f
1554 次点击
所在节点    MySQL
9 条回复
lianyue
327 天前
手写 sql ?
这不影响性能 优化他干嘛。
lianyue
327 天前
xuecat
327 天前
影响啊,因为有俩句一模一样的查询,我时间就 double 了。所以我想看看能不能只查一次
codingadog
327 天前
mysql8 以上可以用 with 语句抽出公共部分,低版本就不知道了。
mightybruce
327 天前
mysql 将这个查询语句创建为一个视图,
这两句改写为在视图上操作。
dog82
327 天前
用 with 子句
declandragon
327 天前
CREATE TEMPORARY TABLE TempTable AS
(SELECT * FROM `tblog` WHERE `ModID`=357 AND `ID`<2147483647 ORDER BY `ID` desc limit 100);

SELECT a.* FROM `tblog` as a
INNER JOIN `structroot` as b ON a.`ModID`=b.`ModuleID` AND a.`SrcGuid`=b.`DataGUID`
INNER JOIN TempTable as f ON f.`ModID`=b.`RootModuleID` AND f.`SrcGuid` = b.`RootDataGUID`
WHERE a.`ID`<2147483647
UNION
SELECT * FROM TempTable;
yidinghe
327 天前
@xuecat 耗时 double 的原因在于 UNION ALL ,所以即便用 WITH 提取出来,恐怕也无济于事。
alwaysdazz
327 天前
WITH FilteredTBlog AS (
SELECT * FROM `tblog`
WHERE `ModID`=357 AND `ID`<2147483647
ORDER BY `ID` DESC
LIMIT 100
)
SELECT a.*
FROM `tblog` AS a
INNER JOIN `structroot` AS b ON a.`ModID` = b.`ModuleID` AND a.`SrcGuid` = b.`DataGUID`
INNER JOIN FilteredTBlog AS f ON f.`ModID` = b.`RootModuleID` AND f.`SrcGuid` = b.`RootDataGUID`
WHERE a.`ID` < 2147483647
UNION ALL
SELECT * FROM FilteredTBlog

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1013705

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX