MySQL深入——25

Join语句如何优化?

Join语句的两种算法,分别为Index Nested-Loop Join和Block Nested-Loop Join

NLJ在大表Join当中还不错,但BNL在大表join时性能就差很多,很耗CPU资源。

如何优化这两个算法

创建t1,t2算法,在t1中插1000行数据,每一行a=1001-id也就是a是逆序的,t2中插入10万条数据。

Multi-Range Read优化(MRR)优化的主要目的为尽量使用顺序读盘。

我们先来看看回表,回表的概念:InnoDB在普通索引a上查到主键id后,再根据一个个主键id到主键索引当中去查找数据的概念。

那么回表是一行行查数据还是批量的查数据呢?

因为主键是一颗b+树,在这颗树上每次只能根据一个主键id查数据,所以回表过程必然是一行一行进行的。

若是随着a的值递增的,id的值就会变为随机的,那么会出现随机访问,性能差,但是如果改变了查询的顺序,性能就会提升。所以我们可以认为,若是按照主键递增的顺序查找,对磁盘的读就会接近顺序读,所以可以提升读性能。

这就是MRR优化的主要思路,语句的执行变成下面这种样子。

1.根据索引a,定位满足的记录,将id值放入read_rnd_buffer中

2.将read_rnd_buffer中的id进行递增排序

3.排序后的id数组,依次到主键id索引当中查记录。

read_rnd_buffer的大小由read_rnd_buffer_size控制,满了之后走完了23,之后再到1继续。

要稳定的使用MRR优化,需要设置optimizer_switch=“mmr_cost_based=off”,因为优化器策略会更倾向于不使用MRR优化,我们这样设置可以强制使用。

MRR能够提升性能的核心在于查询的a是范围查询能够获得足够多的主键id,排序后再去查,才能体现出顺序的优势。

Batched Key Access

MySQL5.6之后引入BKA算法,对NLJ的优化。

NLJ算法是从驱动表t1,一行行的取出a的值,再到被驱动表当中去做join,对于t2来说,每次匹配一个值,MRR是无法使用的。

所以我们可以将t1当中的数据取出来一部分放入join_buffer,一次行传入多个数据给t2,就可以进行优化了。

启用BKA算法

set optimizer_switch='mmr=on,mmr_cost_based=off,batched_key_access=on'

BKA主要依赖于RMM,所以我们得先打开RMM算法。

BNL算法的性能问题

若是一个使用BNL算法的Join语句,多扫描一个冷表,而且这个语句执行时间超过了1秒,就没会再次扫描冷表的时候将这个冷表的数据页移到LRU头部,这种情况是冷表数据量小于整个Buffer Pool的3/8,能够完全放入old区域。

若是这个冷表很大,一个正常访问的数据页进入young区域,join语句就在读磁盘和淘汰内存页的时候,进入old区域的数据页,可能会被删除。

大表join对Io有影响,但是语句结束之后对IO的影响就会结束,但是对于Buffer Pool的影响是持续性的。

可以通过增大joinn_buffer_size的值,减少对驱动表的扫描行数。

对无BNL常见的优化方法就是给被驱动表的join字段加上索引,将BNL转为BKA算法。

一些情况下,直接进将被驱动表上加索引就可以转为BKA算法,当时有些情况下是不可以的,比如:一个十万的表在where的限制条件下筛选出的需要参加join语句的只有2000条,这个时候添加索引就有些浪费了,但是要是不添加索引,一次一次的的对比就太耗费CPU资源,有一种方法可以完美解决这种问题,就是创建一个临时表。

创建一个临时表,将这2000条符合条件的语句添加到其中,然后给这个临时表添加索引,这样触发BKA算法,拉提升性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/730003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gitlab部署流程

安装准备 需要开启ssh:(已开启可跳过) sudo systemctl status sshd sudo systemctl enable sshd sudo systemctl start sshd防火墙开放http、https服务:(已关闭防火墙可跳过) sudo systemctl status fir…

CPU设计实战-加载和存储指令(2)

目录 一 ll和sc指令说明 二 ll和sc指令的实现 1 llbit寄存器 2 译码阶段 3 访存阶段 4 Load相关问题 5 流水线在取指阶段暂停 本章介绍两个比较特殊的加载存储指令ll和sc,这两个指令的存在用于实现信号量机制。 信号量机制:在多线程中为了保证某个…

smplx pkl格式可视化

smplx pkl格式可视化 import glob import os import pickleimport torch import numpy as npfrom smplpytorch.pytorch.smpl_layer import SMPL_Layer from display_utils import display_model, display_model_continuousfrom matplotlib import pyplot as plt from matplotl…

P1551 亲戚题解

题目 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。规定:x 和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x&…

社区服务类创业项目推荐:抓住社区商业新机遇

大家好,我是一名90后鲜奶吧创业者,目前在社区经营5年时间,今天我想和大家分享一些关于社区服务类创业项目的推荐,都是这么多年我见证过生意最好的店面。 1、社区便利店: 随着人们生活节奏的加快,对便利购…

【Linux实践室】Linux常用命令:文件操作|文件夹操作

🌈个人主页:聆风吟 🔥系列专栏:Linux实践室、网络奇遇记 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 🔔Linux文件操作2.1.1 👻创建文件2…

2024年第二届智能制造与自动化前沿国际会议 | Ei、Scopus双检索

会议简介 Brief Introduction 2024年第二届智能制造与自动化前沿国际会议(CFIMA 2024) 会议时间:2024年8月23 -25日 召开地点:中国包头 大会官网:www.cfima.org 随着全球新一轮科技革命和产业变革突飞猛进,…

Java Web开发---复试Tips复习

***********(自用,摘录自各种文章和自己总结)********** 小知识点理解 Web Web应用开发主要是基于浏览器的应用程序开发。一个Web应用由多部分组成 java web就是用java语言开发出可在万维网上浏览的程序 Web应用程序编写完后,…

ES分布式搜索-IK分词器

ES分词器-IK 1、为什么使用分词器? es在创建倒排索引时需要对文档分词;在搜索时,需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。 我们在kibana的DevTools中测试: GET /_analyze {"analyzer": "…

day37 贪心算法part6

738. 单调递增的数字 中等 提示 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 不知道怎么讲思路……以9287举例&#xff0c;…

AntV L7的pointLayer点图层

本案例使用L7库和Mapbox GL JS创建点数据并加载进地图。 文章目录 1. 引入 CDN 链接2. 引入组件3. 创建地图4. 创建场景5. 创建点数据5.1. 普通 json 数据5.2. geojson 数据 6. 创建点图层6.1. 普通 json 数据6.2. geojson 数据 7. 演示效果8. 代码实现 1. 引入 CDN 链接 <s…

【网络连接】ping不通的常见原因+解决方案,如何在只能访问网关时诊断,并修复IP不通的问题

【网络连接】ping不通的常见原因解决方案&#xff0c;如何在只能访问网关时诊断&#xff0c;并修复IP不通的问题 写在最前面网络基础可能的问题、表现以及解决方案如何诊断和解决操作步骤 详细问题描述详细解决方案1. 防火墙或安全软件拦截2. IP配置错误3. 网络设备问题4. 物理…

Java8之 LocalDate,LocalDateTime和处理时间、日期工具类一网打尽

1、java 支持日期格式化 import java.text.SimpleDateFormat; import java.time.format.DateTimeFormatter;public static final String DATE_TIME_FORMATTER_PATTERN "yyyy-MM-dd HH:mm:ss"; public static final String DATE_FORMATTER_PATTERN "yyyy-MM-d…

面试官问:生成订单30分钟未支付,则自动取消,该怎么实现

今天给大家上一盘硬菜&#xff0c;并且是支付中非常重要的一个技术解决方案&#xff0c;有这块业务的同学注意自己试一把了哈&#xff01; 在开发中&#xff0c;往往会遇到一些关于延时任务的需求。例如 生成订单30分钟未支付&#xff0c;则自动取消 生成订单60秒后,给用户发短…

论文翻译:一种基于强化学习的车辆队列控制策略,用于减少交通振荡中的能量消耗

A Reinforcement Learning-Based Vehicle Platoon Control Strategy for Reducing Energy Consumption in Traffic Oscillations 一种基于强化学习的车辆队列控制策略&#xff0c;用于减少交通振荡中的能量消耗 文章目录 A Reinforcement Learning-Based Vehicle Platoon Cont…

QT中的信号和槽

信号和槽概述 在 Qt 中&#xff0c;用户和控件的每次交互过程称为⼀个事件。比如 “用户点击按钮” 是⼀个事件&#xff0c;“用户关闭窗口” 也是⼀个事件。每个事件都会发出⼀个信号&#xff0c;例如用户点击按钮会发出 “按钮被点击” 的信号&#xff0c;用户关闭窗口会发出…

突破编程_前端_JS编程实例(自适应表格列宽)

1 开发目标 针对如下的表格组件&#xff1a; 根据表格的各个列字符串宽度动态调整表格列宽&#xff1a; 2 详细需求 本组件目标是提供一个自动调整 HTML 表格列宽的解决方案&#xff0c;通过 JS 实现动态计算并调整表格每列的宽度&#xff0c;以使得表格能够自适应容器宽度&a…

微信作为私域营销的载体有哪些优势?

私域流量的本质就是&#xff1a; 降低我的获客成本&#xff0c;提高我产品服务的复购率&#xff0c;增加我和用户之间的粘性&#xff0c;挖掘用户的终身价值。 私域流量的优势&#xff1a; 1、更精准&#xff1b; 2、节约成本&#xff0c;减少广告成本&#xff1b; 3、有利于品…

High-Resolution Image Synthesis with Latent Diffusion Models

一、简介 标题:High-Resolution Image Synthesis with Latent Diffusion Models(https://arxiv.org/pdf/2112.10752.pdf;GitHub - CompVis/latent-diffusion: High-Resolution Image Synthesis with Latent Diffusion Models) 期刊:CVPR 时间:2022 作者:Robin Romba…

mongo多数据源动态配置

mongo的配置信息默认使用配置文件的spring.data.mongodb前缀的信息进行配置&#xff0c;但是我想另外配个其他前缀的信息如logging.data.mongodb&#xff0c;区分默认的mongo数据源。这个就需要建个mongo配置类&#xff0c;以logging.data.mongodb前缀去动态配置mongo数据源。 …