V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
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 · 276 天前 · 1495 次点击
    这是一个创建于 276 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    
    第 1 条附言  ·  276 天前
    用 with 完成了,基本和 @alwaysdazz 的一样。
    多谢大家
    9 条回复    2024-02-02 17:43:43 +08:00
    lianyue
        1
    lianyue  
       276 天前
    手写 sql ?
    这不影响性能 优化他干嘛。
    xuecat
        3
    xuecat  
    OP
       276 天前
    影响啊,因为有俩句一模一样的查询,我时间就 double 了。所以我想看看能不能只查一次
    codingadog
        4
    codingadog  
       276 天前
    mysql8 以上可以用 with 语句抽出公共部分,低版本就不知道了。
    mightybruce
        5
    mightybruce  
       276 天前
    mysql 将这个查询语句创建为一个视图,
    这两句改写为在视图上操作。
    dog82
        6
    dog82  
       276 天前   ❤️ 1
    用 with 子句
    declandragon
        7
    declandragon  
       276 天前
    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  
       276 天前
    @xuecat 耗时 double 的原因在于 UNION ALL ,所以即便用 WITH 提取出来,恐怕也无济于事。
    alwaysdazz
        9
    alwaysdazz  
       276 天前 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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5524 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:29 · PVG 16:29 · LAX 00:29 · JFK 03:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.