执行过程无论是使用内存临时表 。还是磁盘临时表 。临时表对组及统计字段的处理的方式都是一样的 。《导读》中我提到想要优化《导读》中的那条SQL 。就需要知道SQL执行的原理 。所以 。下面我就结合上面教学的临时表的概念 。详细讲讲这条SQL的执行过程 。见下图:
文章插图
创建临时表temporary 。表里有两个字段viewed_user_age和count(*) 。主键是viewed_user_age 。如上图 。倒数第二个框temporary表示临时表 。框中包含两个字段viewed_user_age和count(*) 。框内就是这两个字段对应的值 。其中viewed_user_age就是这张临时表的主键扫描表辅助索引树idx_user_viewed_user 。依次取出叶子节点上的id值 。即从索引树叶子节点中取到表的主键id 。如上图中的idx_user_viewed_user框就是索引树 。框右侧的箭头表示取到表的主键id根据主键id到聚簇索引cluster_index的叶子节点中查找记录 。即扫描cluster_index叶子节点:(1) 得到一条记录 。然后取到记录中的viewed_user_age字段值 。如上图 。cluster_index框 。框中最右边的一列就是viewed_user_age字段的值(2) 如果临时表中没有主键为viewed_user_age的行 。就插入一条记录 (viewed_user_age, 1) 。如上图的temporary框 。其左侧箭头表示将cluster_index框中的viewed_user_age字段值写入temporary临时表(3) 如果临时表中有主键为viewed_user_age的行 。就将viewed_user_age这一行的count(*)值加 1 。如上图的temporary框遍历完成后 。再根据字段viewed_user_age在sort_buffer中做排序 。得到结果集返回给客户端 。如上图中的最右边的箭头 。表示将temporary框中的viewed_user_age和count(*)的值写入sort_buffer 。然后 。在sort_buffer中按viewed_user_age字段进行排序通过《导读》中的SQL的执行过程的教学 。咱们发现该过程经历了4个部分:idx_user_viewed_user、cluster_index、temporary和sort_buffer 。对比上面explain的结果 。其中前2个就对应结果中的Using where 。temporary对应的是Using temporary 。sort_buffer对应的是Using filesort 。
优化方案此时 。咱们有什么办法优化这条SQL呢?
既然这条SQL执行需要经历4个部分 。那么 。咱们可不可以去掉最后两部分呢 。即去掉temporary和sort_buffer?Spring Boot 学习笔记 。这个分享给你 。太全了 。
答案是可以的 。咱们只要给SQL中的表t_user_view添加如下索引:
ALTER TABLE `t_user_view` ADD INDEX `idx_user_age_sex` (`user_id`, `viewed_user_age`, `viewed_user_sex`);你可以自己尝试一下哦!用explain康康有什么改变!
小结本章围绕《导读》中的分组统计SQL 。通过explain分析SQL的执行阶段 。结合临时表的结构 。进一步剖析了SQL的详细执行过程 。最后 。引出优化方案:新增索引 。避免临时表对分组字段的统计 。及sort_buffer对分组和统计字段排序 。
当然 。如果实在无法避免使用临时表 。那么 。尽量调大tmp_table_size 。避免使用磁盘临时表统计分组字段 。
思考题为什么新增了索引idx_user_age_sex可以避免临时表对分组字段的统计 。及sort_buffer对分组和统计字段排序?
【group by优化 hive group by 优化总结】提醒:结合索引查找的原理 。
推荐阅读
- 台湾青枣种植技术 台湾青枣的种植情况简介
- 地板瓷砖如何清理又亮又干净不留痕迹 地板瓷砖如何清理又亮又干净
- 你觉得最好的电视直播软件是什么?
- 装修136平米房子大概多少钱 装修房子136平的要多少钱
- 你有没有因为喜欢一个人然后去追了他所有的剧呢?
- 十大哺乳动物排行榜 最大陆生哺乳类动物介绍
- 最好用的电视直播软件?
- 怎样和异性开始第一次聊天?
- 新生儿飞机抱能缓解打嗝吗 新生儿喜欢飞机抱是什么原因