本节sql优化,及详细讲解

来源:3-1 如何实现分组选择数据

哈你

2016-10-16 11:06

有个地方不明白,为什么是 a.kills <= b.kills 呢?

老师的讲课很有启发性,并没有给出优化方案。

写回答 关注

2回答

  • 哈你
    2016-10-16 12:20:33

    我们紧接上楼,内部优化完毕的sql是这样的

    SELECT d.user_name, c.timestr, kills FROM

    (SELECT a.user_id, a.timestr, a.kills, COUNT(b.kills) cnt FROM kills AS a

    JOIN kills b ON a.user_id = b.user_id

    WHERE a.kills <= b.kills

    GROUP BY a.user_id, a.timestr, a.kills) AS c

    JOIN workteam d ON d.work_id = c.user_id WHERE cnt <=2;

    由于 where 从句中的条件和 下面的这个子查询相关联,每进行一个次外围查询就要执行一次子查询,效率不言自明。

    SELECT a.user_id, a.timestr, a.kills, COUNT(b.kills) cnt FROM kills AS a

    JOIN kills b ON a.user_id = b.user_id

    WHERE a.kills <= b.kills

    GROUP BY a.user_id, a.timestr, a.kills


    我们继续优化。

    思路是这样的,JOIN两次 kills 表即可, 第一次关联是为了 查找信息, timestr 和 kills。

    第二次关联是为了 使用 count() 函数统计 比 当前行 kills 大的 数量,供having 语句使用(

    吐槽的各位看官,看到这里是不是发现和上节课老师所讲的求每个人哪天打怪的数目最多的

    思路如出一辙啊)。下面给出sql

    SELECT c.user_name, a.timestr, a.kills   FROM workteam c

    JOIN kills a ON c.work_id = a.user_id

    JOIN kills b ON a.user_id = b.user_id

    WHERE a.kills <= b.kills

    GROUP BY  user_name, kills DESC, timestr

    HAVING COUNT(b.kills) <= 2

    细心的看管,已经发现我这里的表名称, 表字段和老师演示的例子不尽相同。

    kills 表对应 user_kills , workteam 对应 users1,

    work_id 字段对应 id



  • 哈你
    2016-10-16 11:56:30

    首先来看里边的子查询:

    SELECT user_id, timestr, kills , (SELECT COUNT(*) FROM kills AS b WHERE  b.user_id = a.user_id AND a.kills <= b.kills) AS cnt FROM kills a GROUP BY user_id, timestr, kills;
    这一句实际上里边还有一个子查询 , SELECT COUNT(*) FROM kills AS b WHERE  b.user_id = a.user_id AND a.kills <= b.kills, 这句话的关键在于, a.kills <= b.kills 。意思是查出整个表中比 当前行的 kills(a表中) 大的 kills(b表中)的个数。而且 GROUP BY 子句是不必要的。

    这句话的效率是相当低的,因为 每执行一次外围的 select ,就要执行一次里边的select,先用 JOIN优化它。

    SELECT a.user_id, a.timestr, a.kills, COUNT(b.kills) AS cnt FROM kills AS a    
    JOIN kills b ON a.user_id = b.user_id
    WHERE a.kills <= b.kills
    GROUP BY a.user_id, a.timestr, a.kills

    这样内层的优化就完成了,

    那么怎么进行外层优化呢?这的确是一个问题


MySQL开发技巧(一)

DBA和开发人员都必备的技能,SQL技巧一个好程序员必备技能

148779 学习 · 123 问题

查看课程

相似问题