iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >join 优化的基本原则有哪些
  • 915
分享到

join 优化的基本原则有哪些

2024-04-02 19:04:59 915人浏览 薄情痞子
摘要

这篇文章给大家分享的是有关join 优化的基本原则有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 1、join 优化的基本原则: 

这篇文章给大家分享的是有关join 优化的基本原则有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

1、join 优化的基本原则:
   a:小结果集驱动大结果集
   b:  确保被驱动的表被索引
   c:  不能确保驱动表被索引加大 join_buffer_size 的大小。

 原理: Mysql 的 join 算法只有一种  Nested Loop Join 算法。其最基本原理是 循环取驱动表中的每一条记录,
       到匹配表中过滤,得到结果集list,再次循环list每条记录到下个匹配表中过滤,以此类推。

 伪代码【2表关联】:
          for each recode in table_a {
               for each recode in table_b that table_a.column=table_b.column {
                      combination to output;
               }
         }

解析:Nested Loop Join 嵌套循环的代价取决于,内外循环代价的乘积。即 【驱动表行数】N*M【到匹配表中查找一次代价】
     innodb B+ 树索引的高度一般是3 至 4,也就是说一般情况下不管是哪个表作为匹配表,其一次查询代价是常量 T
     即Join代价: N【表行数】*T【常量】所以 要用小结果集作为驱动表,另外强调一点是小结果集而不是小表,因为小 、大 是相对的,完全有可能大表通过过滤的结果
     集比小表还要小的 多。所以强调小结果集。

案例:1.2 亿大表关联 ,优化前执行3个小时没有结果。。。。。。 阿拉好想唱 “等你 爱我 爱我哪怕只有一次也就足够........”
select c.current_name,count(*) 
from  (  select distinct PHONE from cis_data_qixin_score        )a 
join TMP_A1_INFO_MOBILE_H_20151201 b on  substr(a.PHONE,1,7)=b.mobile_h_code     
join TMP_A1_DICT_AREA_20151201 c on c.tele_code=b.prov_telecode 
group by c.current_name  ; 

说明:sql 功能是获取 每个省的 电话号码数量。cis_data_qixin_score:号码表,TMP_A1_INFO_MOBILE_H_20151201  号码H码表,TMP_A1_DICT_AREA_20151201
        号码H码对应省份表
执行计划:
+----+-------------+----------------------+-------+-------------------+-------------------+---------+------+-----------+---------------------------------------+
| id | select_type | table                | type  | possible_keys     | key               | key_len | ref  | rows      | Extra                                 |
+----+-------------+----------------------+-------+-------------------+-------------------+---------+------+-----------+---------------------------------------+
|  1 | PRIMARY     | c                    | ALL   | NULL              | NULL              | NULL    | NULL |        41 | Using temporary; Using filesort       |
|  1 | PRIMARY     |            | ALL   | NULL              | NULL              | NULL    | NULL | 124364159 | Using join buffer (Block Nested Loop) |
|  1 | PRIMARY     | b                    | ref   | idx_mobile_h_code | idx_mobile_h_code | 33      | func |         1 | Using index condition; Using where    |
|  2 | DERIVED     | cis_data_qixin_score | index | PRIMARY,idx_phone | idx_phone         | 62      | NULL | 124364159 | Using index                           |
+----+-------------+----------------------+-------+-------------------+-------------------+---------+------+-----------+---------------------------------------+

分析:由执行计划可知 cis_data_qixin_score 通过号码去重后的衍生表DERIVED2  的124364159  条记录 【实际大概8千万,执行计划统计的不太精确】 作为驱动表和匹
    配表idx_mobile_h_code 35W 条记录 进行Jion。这个正犯了“兵家之大忌”,大的结果集作为驱动表 其代价为 124364159T  。又不能选择小表作为驱动表,
    怎么办? 现在的妹子不都是天天企盼着要减肥嘛,那我们也对“驱动表”这个妹子瘦瘦身吧。

sql功能分析:通过号码表和号码码表  substr(a.PHONE,1,7)=b.mobile_h_code关联 得到 号码的省份的code, 在和 省份表关联 得到省份名称,最后通过省份名称分组得
             出所有省份的号码数量。  也就是说PHONE的前七位的的数字对应相同的 省份code。一言以蔽之。直接对phone 的前七位分组,再join 。
                 

改写后sql:
 select c.current_name,sum(a.cou) 
 from  ( 
       select substr(a.PHONE,1,7) PHONE_h_code ,count(*) cou   
       from (select distinct PHONE from cis_data_qixin_score   ) a 
       group by  substr(a.PHONE,1,7)  order by null 
      )a 
       join TMP_A1_INFO_MOBILE_H_20151201 b on a.PHONE_h_code=b.mobile_h_code     
       join TMP_A1_DICT_AREA_20151201 c on c.tele_code=b.prov_telecode 
 group by c.current_name  ;    

执行计划:
+----+-------------+----------------------+-------+-------------------+-------------+---------+----------------------------+-----------+----------------------------------------------------+
| id | select_type | table                | type  | possible_keys     | key         | key_len | ref                        | rows      | Extra                                              |
+----+-------------+----------------------+-------+-------------------+-------------+---------+----------------------------+-----------+----------------------------------------------------+
|  1 | PRIMARY     | c                    | ALL   | NULL              | NULL        | NULL    | NULL                       |        41 | Using temporary; Using filesort                    |
|  1 | PRIMARY     | b                    | ALL   | idx_mobile_h_code | NULL        | NULL    | NULL                       |    318794 | Using where; Using join buffer (Block Nested Loop) |
|  1 | PRIMARY     |            | ref   |        |  | 23      | cis_gather.b.mobile_h_code |       390 | Using where                                        |
|  2 | DERIVED     |            | ALL   | NULL              | NULL        | NULL    | NULL                       | 124364170 | Using temporary                                    |
|  3 | DERIVED     | cis_data_qixin_score | index | PRIMARY,idx_phone | idx_phone   | 62      | NULL                       | 124364170 | Using index                                        |
+----+-------------+----------------------+-------+-------------------+-------------+---------+----------------------------+-----------+----------------------------------------------------+
5 rows in set (0.00 sec)


解析:通过 对号码前7位分组得到物化表【大概35w】自动创建索引   PHONE_h_code 作为匹配表 。join 代价为350000T
      改写前后join 代价之比为: 124364159T /350000T = 355 哈哈 是不是有种飞起来的赶脚。

结果: 优化后的sql  4  分钟 搞定。

感谢各位的阅读!关于“join 优化的基本原则有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

您可能感兴趣的文档:

--结束END--

本文标题: join 优化的基本原则有哪些

本文链接: https://www.lsjlt.com/news/63391.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • join 优化的基本原则有哪些
    这篇文章给大家分享的是有关join 优化的基本原则有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 1、join 优化的基本原则:  ...
    99+
    2024-04-02
  • Mysql中基本语句优化的原则有哪些
    这篇文章给大家分享的是有关Mysql中基本语句优化的原则有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。mysql基本语句优化原则一、尽量避免在列上运算,这样会导致索引失效s...
    99+
    2024-04-02
  • SQL优化原则有哪些
    这篇文章将为大家详细讲解有关SQL优化原则有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL...
    99+
    2024-04-02
  • SEO优化原则有哪些
    这篇文章给大家分享的是有关SEO优化原则有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  1. 关键词优化  1)关键词选择策略:两高一低: 高搜索量, 与页面内容高相关, SEO竞争低。选择搜索量高的词也...
    99+
    2023-06-09
  • 网页基本性能优化规则有哪些
    小编给大家分享一下网页基本性能优化规则有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!针对浏览器网页的一些优化规则页面优化静态资源压缩借助构建工具(webpa...
    99+
    2023-06-08
  • SQL数据库的优化原则有哪些
    这期内容当中小编将会给大家带来有关SQL数据库的优化原则有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。关于SQL数据库优化的原则主要可以从以下几个方面着手:设计方面...
    99+
    2024-04-02
  • mysql join优化的技巧有哪些
    优化MySQL JOIN操作可以提高查询性能,以下是一些常见的优化技巧:1. 使用合适的索引:确保参与JOIN的列都有合适的索引,这...
    99+
    2023-10-23
    mysql join
  • jvm垃圾收集的基本原则有哪些
    JVM垃圾收集的基本原则有以下几个:1. 引用计数:每个对象都有一个与之关联的计数器,当对象被引用时,计数器加1;当对象的引用被释放...
    99+
    2023-09-25
    jvm
  • Flex内存释放优化原则有哪些
    这篇文章主要介绍了Flex内存释放优化原则有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Flex内存释放优化原则被删除对象在外部的所有引用一定要被删除干净才能被系统当成...
    99+
    2023-06-17
  • 优化golang函数与goroutine交互的原则有哪些?
    golang 中优化函数和 goroutine 交互的原则包括:使用无缓冲通道进行通信以避免数据丢失。使用互斥锁或读写锁保护共享资源。使用信号量或等待组限制 goroutine 的并发数...
    99+
    2024-05-04
    并发 golang 数据丢失 同步机制
  • MySQL中JOIN连接的基本用法有哪些
    这篇文章主要介绍“MySQL中JOIN连接的基本用法有哪些”,在日常操作中,相信很多人在MySQL中JOIN连接的基本用法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL中JOIN连接的基本用法...
    99+
    2023-06-30
  • oracle SQL优化规则有哪些
    这篇文章主要讲解了“oracle SQL优化规则有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“oracle SQL优化规则有哪些”吧! 1>选...
    99+
    2024-04-02
  • css规则的基本格式有哪些
    本篇内容主要讲解“css规则的基本格式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css规则的基本格式有哪些”吧! css规...
    99+
    2024-04-02
  • python基本语法规则有哪些
    python 的基本语法规则包括:使用缩进来定义代码块。使用变量存储数据,并通过 = 赋值运算符赋值。支持多种数据类型,如数字、字符串和列表。提供算术、关系、逻辑和赋值运算符。使用控制流...
    99+
    2024-04-20
    python 键值对
  • mysql sql优化的基本的分析命令有哪些
    今天就跟大家聊聊有关mysql sql优化的基本的分析命令有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 exp...
    99+
    2024-04-02
  • 网站URL标准化的原则有哪些
    这篇文章给大家分享的是有关网站URL标准化的原则有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。网站URL标准化12条原则  1.推荐申请自己的独立域名来建立网站,这一点现在已经不是问题。  2.尽量使用静态...
    99+
    2023-06-10
  • SQL优化极简法则有哪些
    这篇文章主要介绍SQL优化极简法则有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!查询优化是一个复杂的工程,涉及从硬件到参数配置、不同数据库的解析器、优化器实现、SQL 语句的执...
    99+
    2024-04-02
  • Go错误处理的基本规则有哪些
    这篇文章主要讲解了“Go错误处理的基本规则有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go错误处理的基本规则有哪些”吧!规则1-不要忽略错误迟早你的函数将返回失败,你将花费大量时间来...
    99+
    2023-06-03
  • 高性能网站优化的规则有哪些
    这篇文章主要讲解了“高性能网站优化的规则有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“高性能网站优化的规则有哪些”吧!性能黄金法则:只有10%~20%的最终用户响应时间花在了下载HTM...
    99+
    2023-06-08
  • 基本的视觉化方法有哪些
    这篇文章主要讲解了“基本的视觉化方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基本的视觉化方法有哪些”吧!首先,图表是什么图表由一组有限顶点或节点...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作