范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

MySQLjoin实现原理

  join实现原理
  MySQl在设计时,采用了这样的思路:针对主要应用场景选择一个或几个性能优异的核心算法作为引擎,然后努力将一些非主要应用场景作为该算法的特例或变种植入到引擎当中。(system>const>ref>ref_eq>range>index>all) join实现原理
  Join是select的核心,Join是根。 Join buffer:Block Nested-Loop Join (BNL)-----------join buffer 只有当join查询中有表用到以下查询: All:全表扫描, Index:全索引扫描, Range:范围扫描,如 in(),id>18000, index_merge: 的时候,join查询才会用到join buffer。 在MySQL 中只有一种 Join 算法: Nested Loop Join(没有其他很多数据库所提供的 Hash Join,也没有 Sort Merge Join)。
  驱动表用这个表作为第一个查询的表,其他表在这个基础上递归。
  Nested Loop Join				Nested Loop Join 就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的 数据作为过滤条件到下一个表中查询数据,然后合并结果。如果还有第三个参与 Join,则再通过前两个表 的 Join 结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复。接下来通 过一个三表join查询来说明mysql的Nested Loop Join的实现方式。 select  	m.subject msg_subject, c.content msg_content   from  	user_group g,group_message m,group_message_content c   where  	g.user_id = 1   and  	m.group_id = g.group_id   and  	c.group_msg_id = m.id  ; 使用explain看看执行计划: Explain select  	m.subject msg_subject, c.content msg_content   from  	user_group g,group_message m,group_message_content c   where  	g.user_id = 1   and  	m.group_id = g.group_id   and  	c.group_msg_id = m.id  ; 结果如下: *************************** 1. row ***************************   id: 1   select_type: SIMPLE   table: g   type: ref   possible_keys: user_group_gid_ind,user_group_uid_ind,user_group_gid_uid_ind   key: user_group_uid_ind   key_len: 4   ref: const   rows: 2   Extra:  *************************** 2. row ***************************   id: 1   select_type: SIMPLE   table: m   type: ref   possible_keys: PRIMARY,idx_group_message_gid_uid    key: idx_group_message_gid_uid   key_len: 4   ref: g.group_id  (根据g表的group_id查,所以要先查出g表记录,每条g表符合记录对m表递归) rows: 3   Extra:   *************************** 3. row ***************************   id: 1   select_type: SIMPLE   table: c   type: ref   possible_keys: idx_group_message_content_msg_id   key: idx_group_message_content_msg_id   key_len: 4   ref: m.id  (根据m表的id查,所以要先查出m表记录,每条m表符合条件记录递归c表) rows: 2   Extra:   ******************************************************   从结果可以看出,explain选择user_group作为驱动表,首先通过索引user_group_uid_ind来进行const 条件的索引ref查找,然后用user_group表中过滤出来的结果集group_id字段作为查询条件,对group_message 循环查询,然后再用过滤出来的结果集中的group_message的id作为条件与group_message_content的 group_msg_id进行循环比较查询,获得最终的结果。 这个过程可以通过如下伪代码来表示: for each record g_rec in table user_group that g_rec.user_id=1{      for each record m_rec in group_message that m_rec.group_id=g_rec.group_id{           for each record c_rec in group_message_content that c_rec.group_msg_id=m_rec.id                 pass the (g_rec.user_id, m_rec.subject, c_rec.content) row           combination to output;       } } 如果去掉group_message_content表上面的group_msg_id字段的索引,执行计划会有所不一样。 drop index idx_group_message_content_msg_id on group_message_content; Explain select  	m.subject msg_subject, c.content msg_content   from  	user_group g,group_message m,group_message_content c   where  	g.user_id = 1   and  	m.group_id = g.group_id   and  	c.group_msg_id = m.id  ; 得到的执行计划如下: *************************** 1. row ***************************   id: 1   select_type: SIMPLE   table: g   type: ref   possible_keys: user_group_uid_ind   key: user_group_uid_ind   key_len: 4   ref: const   rows: 2   Extra:   *************************** 2. row ***************************   id: 1   select_type: SIMPLE   table: m   type: ref   possible_keys: PRIMARY,idx_group_message_gid_uid   key: idx_group_message_gid_uid   key_len: 4   ref: g.group_id   rows: 3   Extra:   *************************** 3. row ***************************   id: 1   select_type: SIMPLE   table: c   type: ALL   possible_keys: NULL   key: NULL   key_len: NULL   ref: NULL   rows: 96   Extra:Using where;Using join buffer   ****************************************************** 因为删除了索引,所以group_message_content的访问从ref变成了ALL,keys相关的信息也变成了NULL,Extra信息也变成了Using Where和Using join buffer, 这时获取content内容只能通过对全表的数据进行where过滤才能获取。Using join buffer是指使用到了Cache,只有当join类型为ALL,index,range或者是index_merge 的时候才会使用join buffer,它的使用过程可以用下面代码来表示: for each record g_rec in table user_group{       for each record m_rec in group_message that m_rec.group_id=g_rec.group_id{            put (g_rec, m_rec) into the join buffer            if (buffer is full)                  flush_buffer();       } } flush_buffer(){       for each record c_rec in group_message_content that c_rec.group_msg_id = c_rec.id{             for each record in the join buffer                  pass (g_rec.user_id, m_rec.subject, c_rec.content) row combination to output;       }       empty the buffer; } 在实现过程中可以看到把user_group和group_message的结果集放到join buffer中,而不用每次user_group 和group_message关联后马上和group_message_content关联,这也是没有必要的;需要注意的是 join buffer中只保留查询结果中出现的列值,它的大小不依赖于表的大小,我们在伪代码中看到当join buffer 被填满后,mysql将会flush buffer,flush buffer时将3者做关联并返回到输出output。
  针对join实现原理想到的->join语句的优化 1、在query中用order by时,尽可能利用已有的索引避免实际的排序计算; 2、在有些 query 的优化过程中,为了避免实际的排序操作而调整索引字段的顺序,甚至是增加索引字段 也是值得的。当然,在调整索引前,同时还需要评估调整该索引对其他 query 所带来的影响,平衡整体得失。 3、用小结果集驱动大结果集,尽量减少join语句中的Nested Loop的循环总次数; 4、优先优化Nested Loop的内层循环,因为内层循环是循环中执行次数最多的,每次循环提升很小的性能 都能在整个循环中提升很大的性能; 5、对被驱动表的join字段上建立索引(前面看到,没有索引的要做全表扫描); 6、当被驱动表的join字段上无法建立索引的时候,设置足够的Join Buffer Size,当mysql对条件字段进行 排序时,如果需要排序字段的总长度大于该参数的值的时候,mysql就会对需要排序的字段使用临时表进行 分段,这样也会有性能的消耗。

如何评价小米Mix4?搭载888的它都有哪些变化?好久不见甚是想念小伙伴们,这里是池鱼数码近些天发布的小米Mix4,想必大家耳熟能详!今天咱们一起来聊一聊这款小米Mix4!全面屏时代早已来到,随着社会,科技不断发展创新,手机数码行苹果计划发布多款产品,M1XMacBookPro将于11月上市Apple将在今年秋季举办多场活动,第一场活动可能会在9月份推出iPhone13。去年,由于全球健康危机和生产限制,iPhone12阵容直到10月才公布。2020年9月的活动不是专苹果官翻iPadPro开卖节省2000多上个周末,苹果在中国官网上线了2020款iPadPro官翻国行版本。新产品与全新版本的机型配置完全一致,价格还是很合适的,其中128GB版售价5999元256GB版售价6699元5无需供电Wi1080P7问世近年来,监控摄像头在城市交通等公共领域得到了空前广泛的应用,与此同时,家用商用监控也迎来了蓬勃发展。从有线监控到无线监控,从监控到4G监控,创新设计的网络监控不断刷新着人们的认知,小米MIX4预约量突破50万4999的价格卖疯了经过一个周末,数据显示小米MIX4预约量突破了52万。作为一款售价为4999元的新机,小米MIX4开售瞬间便被抢购一空,52万的预约量也意味着米粉对这款旗舰有着极高的购买热情,而在实测绿厂饼干充电器,小巧便携只是小优点,199入手太值了随着手机平板和笔记本等数码产品的普及,充电器早已成为每天都会用到,并且必不可少的物品。想要数码产品迅速回血,充电器的功率直接影响使用体验,但考虑到便携性的话,充电器体积和重量又成为暴风集团被执行近3亿元,曾欠2。6亿仅还244万,老板冯鑫仍在狱中8月16日消息,据天眼查App显示,昔日妖股之王暴风集团股份有限公司(下称暴风集团)新增被执行人信息,执行标的2。87亿元,执行法院为深圳市中级人民法院。相关案由显示为金融借款合同搭载骁龙888,荣耀Magic3Pro成驭龙高手8月12日,荣耀Magic3系列正式发布,其中荣耀Magic3Pro以及荣耀Magic3至臻版都搭载了高通骁龙888Plus芯片,这颗全新的旗舰芯片在荣耀Magic3Pro上会有什雷军退还小米手机1收入!每人赠送1999元红包,米粉已上架闲鱼,1000元1999元不等中国经济周刊经济网讯近日,小米创始人雷军公布小米十周年感恩红包领取情况称,截至8月15日16时,已有96986位用户收到1999元红包,累计1。94亿。据悉,8月10日的2021年华为鸿蒙再登央视升级人数超过五千万!华为3亿小目标再更新在中国不断发展的道路上,总会遇到许多拦路虎,其中的美国就是最大的那只,中国在不断的发展强大起来,而美国就开始想方设法的进行阻拦,对中国的企业重拳出击,各种打压。中国在科技领域内有些三星S22系列少数设备配备AMD图像的Exynos处理器虽然三星才刚刚发布了两款GalaxyZ系列手机,而同样采用骁龙888处理器的GalaxyS21FE也预计会在短期内发布,但不少打算换机,尤其是密切关注手机新闻的消费者,可能都正在等
AppleMusic好用吗?苹果在2015推出AppleMusic音乐服务,并在去年有3000万用户加入订阅,现在苹果这个流媒体音乐服务又达到一个新的里程碑了,日前公布在全球115个国家内已经有超过4000万工业互联网部署又进一步万亿蓝海在前一文速览潜在受益平台名单科创板日报(上海,研究员郑远方)讯,日前,工信部为中国信息通信研究院工业互联网标识解析国家顶级节点发放首张工业互联网标识服务许可证,这是自工业互联网标识管理办法(下称管理办法)发布诈骗分子无孔不入,到底该怎么防?随着5G物联网人工智能等新技术的快速发展电信网络诈骗也日新月异让人防不胜防。诈骗分子利用网络几乎可以对任何一个在线群体实施犯罪01hr喂,是张女士吗?我是公安局户籍科陈警官,你的账很多人反映新电表转得比较快?是这样吗?感觉是这样的,费用好像比没换表前翻倍,听到的借口说是现在的表比以前的灵敏,以前的老表在使用的电器功率比较小的时候不会转,而现在的电表哪怕是很小的功率也会运转,细想一下,这个说法也是极狐阿尔法S华为HI版验证车下线,提供自动驾驶功能,将年前交付华为在汽车领域进行了多次布局,但华为官方却声明表示华为在未来不会制造汽车,而是会帮助那些汽车企业制造出更优秀的车。就目前来说,华为已经为许多传统汽车企业提供了万物互联自动驾驶等功能华为芯片新专利公开,直指芯片封测8月6日,华为申请的一项名为芯片封装结构电子设备芯片封装方法以及封装设备发明专利被公开。申请公布号CN113228268A申请号CN201880100493。2分类号H01L2357500元以上手机怎么选?目前这3部手机最值得考虑,你会怎么选?很多人买手机喜欢买贵的,这也是很正常的,因为贵的手机堆料猛,体验也好,使用寿命也长,可以让你更加省心!目前市面上贵的手机也挺多的,所以也不要乱买,竟然都出钱那么多了,那肯定要买到称小米汽车注册地落地亦庄!经营范围公示记者9月2日获悉,小米汽车注册地已经揭晓,其注册地为北京经济技术开发区。国家企业信用信息公示系统显示,小米汽车有限公司的注册地址是在北京,其登记机关为北京经济技术开发区市场监督管理五部门加强新能源汽车动力蓄电池利用管理来源人民日报本报北京9月1日电(记者王政)工业和信息化部科技部生态环境部商务部市场监管总局近日联合印发新能源汽车动力蓄电池梯次利用管理办法(以下简称办法)。办法提出,鼓励梯次利用企滴滴双证合规高分司机的真实写照2018年12月初,我在广州的一家与滴滴合作的线下租赁公司以23万高价的分期融租方试买了一辆丰田雷凌双擎的燃油车,以这种方式加入滴滴跑网约车,其中的成本之高费用之多就不一一祥述了!纯电汽车专利哪家强?丰田排名第一特斯拉只排第五新能源汽车已经成为汽车行业发展的未来趋势,其中,纯电动汽车更是大家争相追逐研发的一个方向。为了能够在未来的电动汽车市场占据更有利的位置,不少车企都在大力研发电动汽车相关技术,也申请