› 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 · 2699 views
    This topic created in 980 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  
    PRO
       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   ·   Privacy   ·   Solana   ·   3295 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 11:51 · PVG 19:51 · LAX 04:51 · JFK 07:51
    ♥ Do have faith in what you're doing.