MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
xuecat
V2EX  ›  MySQL

求助一个 SQL 优化

  •  
  •   xuecat · Feb 2, 2024 · 2270 views
    This topic created in 832 days ago, the information mentioned may be changed or developed.
    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
    
    Supplement 1  ·  Feb 2, 2024
    用 with 完成了,基本和 @alwaysdazz 的一样。
    多谢大家
    9 replies    2024-02-02 17:43:43 +08:00
    lianyue
        1
    lianyue  
       Feb 2, 2024
    手写 sql ?
    这不影响性能 优化他干嘛。
    xuecat
        3
    xuecat  
    OP
       Feb 2, 2024
    影响啊,因为有俩句一模一样的查询,我时间就 double 了。所以我想看看能不能只查一次
    Duolingo
        4
    Duolingo  
       Feb 2, 2024
    mysql8 以上可以用 with 语句抽出公共部分,低版本就不知道了。
    mightybruce
        5
    mightybruce  
       Feb 2, 2024
    mysql 将这个查询语句创建为一个视图,
    这两句改写为在视图上操作。
    dog82
        6
    dog82  
       Feb 2, 2024   ❤️ 1
    用 with 子句
    declandragon
        7
    declandragon  
       Feb 2, 2024
    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
        8
    yidinghe  
       Feb 2, 2024
    @xuecat 耗时 double 的原因在于 UNION ALL ,所以即便用 WITH 提取出来,恐怕也无济于事。
    alwaysdazz
        9
    alwaysdazz  
       Feb 2, 2024 via Android   ❤️ 1
    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
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   944 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 20:07 · PVG 04:07 · LAX 13:07 · JFK 16:07
    ♥ Do have faith in what you're doing.