亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

本節sql優化,及詳細講解

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

老師的講課很有啟發性,并沒有給出優化方案。

正在回答

2 回答

我們緊接上樓,內部優化完畢的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



3 回復 有任何疑惑可以回復我~

首先來看里邊的子查詢:

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

這樣內層的優化就完成了,

那么怎么進行外層優化呢?這的確是一個問題


1 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

本節sql優化,及詳細講解

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號