知識布局-mysql-組內排序
問題描述:假設每個時間點有多篇文章,每篇文章有訪問量,我們需要求每個時間點的訪問量的前十名。
表結構如下:
欄位解釋:
times:博客的訪問次數
article_name:博客文章的名稱
monitor_time:系統採集時的時間
我寫的垃圾sql:
SELECT UNIX_TIMESTAMP(b.monitor_time) AS time_sec, b.times AS VALUE, b.article_name AS metricFROM blogs bWHERE (SELECT count(*) FROM blogs WHERE monitor_time=b.monitor_time AND times > b.times AND user_name=b.user_name )<10 ANDb.monitor_time>= 2017-12-17 21 ) AND b.user_name =zach ORDER BY b.monitor_time,b.times DESC;
dba幫忙優化後的sql:
SELECT time_sec,VALUE , metric, rnumFROM ( SELECT UNIX_TIMESTAMP(b.monitor_time) AS time_sec, times VALUE , b.article_name AS metric, CASE WHEN @mtime = b.monitor_time THEN @rn :=@rn + 1 ELSE @rn := 1 END rnum, @mtime := b.monitor_time FROM blogs b, ( SELECT @mtime := NULL ,@rn := NULL ) tb WHERE b.monitor_time >= 2017-12-17 21 ORDER BY b.monitor_time, b.times DESC ) taWHERE rnum <= 10;
總結:
我寫的sql數據量在2000直接就查不出來了,專業dba寫的速度在0.35秒左右。真是術業有專攻呀。
推薦閱讀:
※SQL 查詢按照家庭住址進行分組時,組內平均年齡小於50歲的組中成員的姓名和年齡?
※《深入淺出SQL》學習筆記
※【譯文】如何在R語言中使用SQL命令
※sql 查詢如何將結果集 輸出為一段字元串?