Mysqlグループbyパケット統計最適化
7829 ワード
GROUP BYでビッグデータを統計する場合は、クエリーと統計を分離し、クエリー文を最適化する必要があります.
最適化前のクエリー
最適化後のクエリー
groupby実行計画using filesortが表示されます
最適化スキームgroup by fieldの後ろにorder by nullを追加explainでusing filesortを表示することでmysqlのgroup byの本質を理解する
using filesortとusing temporary最適化
元join接続文
最適化可能
groupbyサブクエリ最適化
groupbyサブクエリ最適化
最適化前のクエリー
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サブクエリ最適化