Mysqlグループbyパケット統計最適化

7829 ワード

GROUP BYでビッグデータを統計する場合は、クエリーと統計を分離し、クエリー文を最適化する必要があります.
最適化前のクエリー
SELECT cpe_id, COUNT(*) restarts
FROM business_log 
WHERE operate_time>='2012-12-05 00:00:00' AND operate_time<'2018-01-05 00:00:00' AND operate_type=3 AND result=0
GROUP BY cpe_id

最適化後のクエリー
SELECT cpe_id, COUNT(*) restarts
FROM (
    SELECT cpe_id
    FROM business_log
    WHERE operate_time>='2012-12-05 00:00:00' AND operate_time<'2018-01-05 00:00:00' AND operate_type=3 AND result=0
) t
GROUP BY cpe_id

groupby実行計画using filesortが表示されます
最適化スキームgroup by fieldの後ろにorder by nullを追加explainでusing filesortを表示することでmysqlのgroup byの本質を理解する
using filesortとusing temporary最適化
元join接続文
SELECT SUM( video_flowers.number ) AS num, video_flowers.flower_id, flowers.title, flowers.image 
FROM `video_flowers`
	JOIN `flowers` ON `video_flowers`.`flower_id` = `flowers`.`id`
	JOIN `video_posts` ON `video_flowers`.`video_post_id` = `video_posts`.`id` 
WHERE `video_posts`.`user_id` = 36 
GROUP BY `video_flowers`.`flower_id`


最適化可能
SELECT  vf.num, flowers.title, flowers.image
FROM `flowers`
       join
    (SELECT   SUM(video_flowers.number) AS num, video_flowers.flower_id, video_flowers.video_post_id
    FROM  video_flowers 
    GROUP BY `video_flowers`.`flower_id`) AS vf ON `vf`.`flower_id` = `flowers`.`id`
    join `video_posts` on `video_posts`.`id` = vf.`video_post_id`
    where video_posts.user_id = 36;

groupbyサブクエリ最適化
groupbyサブクエリ最適化