• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MYSQL子查询和嵌套查询优化实例解析

    查询游戏历史成绩最高分前100

    Sql代码

    SELECT ps.* FROM cdb_playsgame ps WHERE ps.credits=(select MAX(credits)  
    FROM cdb_playsgame ps1  
    where ps.uid=ps1.uid AND ps.gametag=ps1.gametag) AND ps.gametag='yeti3'  
    GROUP BY ps.uid order by ps.credits desc LIMIT 100; 

    Sql代码

    SELECT ps.*  
    FROM cdb_playsgame ps,(select ps1.uid, ps1.gametag, MAX(credits) as credits 
    FROM cdb_playsgame ps1 group by uid,gametag) t 
    WHERE ps.credits=t.credits AND ps.uid=t.uid AND ps.gametag=t.gametag AND ps.gametag='yeti3'  
    GROUP BY ps.uid order by ps.credits desc LIMIT 100; 

    执行时间仅为0.22秒,比原来的25秒提高了10000倍

    查询当天游戏最好成绩

    Sql代码

     SELECT ps. * , mf. * , m.username 
    FROM cdb_playsgame ps 
    LEFT JOIN cdb_memberfields mf ON mf.uid = ps.uid 
    LEFT JOIN cdb_members m ON m.uid = ps.uid 
    WHERE ps.gametag = 'chuansj' 
    AND FROM_UNIXTIME( ps.dateline, '%Y%m%d' ) = '20081008' 
    AND ps.credits = ( 
    SELECT MAX( ps1.credits ) 
    FROM cdb_playsgame ps1 
    WHERE ps.uid = ps1.uid 
    AND ps1.gametag = 'chuansj' 
    AND FROM_UNIXTIME( ps1.dateline, '%Y%m%d' ) = '20081008' ) 
    GROUP BY ps.uid 
    ORDER BY credits DESC 
    LIMIT 0 , 50  

    像查询里:

    AND ps.credits=(SELECT MAX(ps1.credits)  
     FROM {$tablepre}playsgame ps1 where ps.uid=ps1.uid AND ps1.gametag = '$game'  
     AND FROM_UNIXTIME(ps1.dateline, '%Y%m%d') = '$todaytime' ) 

    特别消耗时间

    另外,像:

    FROM_UNIXTIME(ps1.dateline, '%Y%m%d') = '$todaytime' 

    这样的语句会导致索引无效,因为对每个dataline的值都需要用函数计算一遍,需要调整为:

    Sql代码

    AND ps1.dateline >= UNIX_TIMESTAMP('$todaytime')  

    //更改后
    Sql代码

     SELECT ps. * , mf. * , m.username 
    FROM cdb_playsgame ps, cdb_memberfields mf, cdb_members m, ( 
     
    SELECT ps1.uid, MAX( ps1.credits ) AS credits 
    FROM cdb_playsgame ps1 
    WHERE ps1.gametag = 'chuansj' 
    AND ps1.dateline >= UNIX_TIMESTAMP( '20081008' ) 
    GROUP BY ps1.uid 
    ) AS t 
    WHERE mf.uid = ps.uid 
    AND m.uid = ps.uid 
    AND ps.gametag = 'chuansj' 
    AND ps.credits = t.credits 
    AND ps.uid = t.uid 
    GROUP BY ps.uid 
    ORDER BY credits DESC 
    LIMIT 0 , 50  

    对于每个球员,找出球员号码,名字以及他所引起的罚款的号码,但只是针对那些至少有两次罚款的球员。

    更紧凑的查询,在FROM子句中放置一个子查询。

    Sql代码

    SELECT PLAYERNO,NAME,NUMBER 
    FROM (SELECT PLAYERNO,NAME, 
           (SELECT COUNT(*) 
           FROM PENALTIES 
           WHERE PENALTIES.PLAYERNO = 
              PLAYERS.PLAYERNO) 
           AS NUMBER 
        FROM PLYERS) AS PN 
    WHERE NUMBER>=2 

    FROM子句中的子查询决定了每个球员的号码,名字和罚款的编号。接下来,这个号码变成了中间结果中的一列。然后指定了一个条件(NUMBER>=2);最后,获取SELECT子句中的列。

    总结

    以上就是本文关于MYSQL子查询和嵌套查询优化实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:mysql in语句子查询效率慢的优化技巧示例、浅谈mysql的子查询联合与in的效率等,如有不足之处请留言,小编会及时更正。

    感谢朋友们对脚本之家网站的支持!

    您可能感兴趣的文章:
    • MySQL里面的子查询实例
    • 解决MySQL中IN子查询会导致无法使用索引问题
    • 详细讲述MySQL中的子查询操作
    • 详解MySQL子查询(嵌套查询)、联结表、组合查询
    • mysql in语句子查询效率慢的优化技巧示例
    • MySQL优化之使用连接(join)代替子查询
    • Mysql子查询IN中使用LIMIT应用示例
    • mysql实现多表关联统计(子查询统计)示例
    • MySQL笔记之子查询使用介绍
    • MySQL子查询中order by不生效问题的解决方法
    上一篇:mysql in语句子查询效率慢的优化技巧示例
    下一篇:MySQL优化之使用连接(join)代替子查询
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MYSQL子查询和嵌套查询优化实例解析 MYSQL,子,查询,和,嵌套,优化,