《MySQL——join语句优化tips》

目录

    • 要不要用join
    • Join驱动表选择
    • Multi-Range Read优化
    • Batched Key Access (BKA)对NLJ进行优化
    • BNL算法性能问题
    • BNL转BKA

要不要用join

1、如果使用的是Index Nested-Loop Join算法,即可以用上被驱动表的索引,可以用

2、如果使用的是Block Nested-Loop Join算法。扫描行数过多,尤其是大表join会导致扫描多次被驱动表,会占用大量系统资源,这种Join尽量不要用

Join驱动表选择

1、如果是Index Nested-Loop Join算法,使用小表做驱动表

2、如果是Block Nested-Loop Join算法,在 join_buffer_size 足够大,大表小表一样,当 join_buffer_size 不够大时,选择小表做驱动表

注意,在决定哪个表做驱动表时,应该是两个表按照各自条件过滤完成之后,计算参与join的各个字段的总数据量,数据量小的表,那就是小表。

Multi-Range Read优化

若有这样查询语句:

select * from t1 where a>=1 and a<=100;

a值是递增的,但是回表后的id并非如此,而是随机的,会带来性能损失。

大多数数据按照主键递增顺序插入得到,所以我们可以认为如果按照主键的递增顺序查找的话,对磁盘的读比较接近顺序读,从而可以提升读性能。

1、根据索引a,定位到满足条件的记录,将id值放入read_rnd_buffer中;

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

3、排序后的id数组,依次到主键id索引中查找记录,并作为结果返回

总的来说就是:**先将索引数据缓存,查到id之后,排序之后再回表 **

用法:

设置:

set optimizer_switch="mrr_cost_based=off

现在的优化器在判断消耗时,更倾向于不使用MRR,所以需要设置为off后,就会固定使用MRR

Batched Key Access (BKA)对NLJ进行优化

Index Nested-Loop Join执行逻辑是:从驱动表t1,一行行取出a值,再到驱动表t2去做join。对于表t2来说,每次都是匹配一个值,MMR优势用不上。

既然这样,将表t1的数据取出来一部分,先放到一个临时内存里:join_buffer.

然后在此基础上复用MRR即可。

使用方法:

set optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on';

BNL算法性能问题

之前提到过InnoDB的LRU优化:第一次从磁盘读入内存的数据页,会先放到old区域,如果1s后这个数据页不再被访问,就不会移动到LRU链表头部,这样对Buffer Pool命中率影响就不大了。

如果使用了BNL的join语句,多次扫描一个冷表,并且这个语句执行时间超过1s,就会在再次扫描冷表时,把冷表的数据页移动到LRU链表头部。

如果冷表数据很大, 会一直占据old区,正常页无法进入,无法更新young区
tips: 冷表,指表中数据还没有加载到bufferpool中,需要先从盘里读出来的表
又因为优化机制,一个正常访问的数据页要进入young区域,需要隔1s再次被访问到。由于join’语句在循环都磁盘和淘汰内存页,进入old区域的数据页很可能在1s之内就被淘汰了。

大表join后对于Buffer Pool的影响是持续性的,需要依靠后续的查询请求慢慢恢复内存命中率。

总结,BNL对于系统的影响:

1、可能多次扫描被驱动表,占用磁盘IO资源

2、判断join条件执行M * N次,占用CPU资源

3、可能导致Buffer Pool的热数据被淘汰,影响内存命中率

所以我们需要优化BNL,通过给驱动表的join字段加索引的方式,将BNL转换为BKA

BNL转BKA

对于一些不常执行大表join的sql,不在被驱动表上创建索引的情况,可以创建一个临时表 create templete table在这个临时表上创建索引,然后让驱动表与临时表做join操作。 为什么不在被驱动表上创建索引,是因为这块sql功能不常用,创建索引浪费空间,并且可能触发这块的join sql 也不经常调用。

创建临时表以及join语句示例如下:

create temporary table temp_t(id int primary key, a int, b int, index(b))engine=innodb;
insert into temp_t select * from t2 where b>=1 and b<=2000;
select * from t1 join temp_t on (t1.b=temp_t.b);

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

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

相关文章

scala中抽象类_Scala中的抽象类

scala中抽象类抽象类 (Abstract Class) In the Scala programming language, abstraction is achieved using abstract class. 在Scala编程语言&#xff0c; 抽象是使用抽象类来实现的。 Abstraction is the process of showing only functionality and hiding the details fr…

不能catch Fatal的exception

Clemens Vasters - Are you catching falling knives?里给了一个判断C#的exception是不是fatal的代码&#xff0c;可以参考参考。 public static bool IsFatal(this Exception exception) {while (exception ! null){if (exception as OutOfMemoryException ! null &&…

HDU 2824 The Euler function

筛法计算欧拉函数 #include <iostream> #include <cstdio> using namespace std; const int maxn3000005; long long phi[maxn]; int main(){int i,j,a,b;for(i1;i<maxn;i) phi[i]i;for(i2;i<maxn;i2) phi[i]/2;for(i3;i<maxn;i2)if(phi[i]i){for(ji;j<…

LinkChecker 8.1 发布,网页链接检查

LinkChecker 8.1 可对检查时间和最大的 URL 数量进行配置&#xff1b;当使用 HTTP 请求时发送 do-not-track 头&#xff1b;生成 XML 的 sitemap 用于搜索引擎优化&#xff1b;检测 URL 长度和重复的页面内容&#xff1b;修复了很多检查的 bug。 LinkChecker 是一个网页链接检查…

c语言语言教程0基础_C语言基础

c语言语言教程0基础Hey, Folks here I am back with my second article on C language. Hope you are through with my previous article C language - History, Popularity reasons, Characteristics, Basic structure etc. In this one, I will cover some fundamental conce…

《MySQL——临时表》

内存表与临时表区别 临时表&#xff0c;一般是人手动创建。 内存表&#xff0c;是mysql自动创建和销毁的。 内存表&#xff0c;指的是使用Memory引擎的表&#xff0c;建表语法&#xff1a;create table ... engine memeory 表的数据存在内存里&#xff0c;系统重启后会被清…

android中ActionBar的几个属性

actionBar.setHomeButtonEnabled //小于4.0版本的默认值为true的。但是在4.0及其以上是false&#xff0c;该方法的作用&#xff1a;决定左上角的图标是否可以点击。没有向左的小图标。 true 图标可以点击 false 不可以点击。 actionBar.setDisplayHomeAsUpEnabled(true) //…

drei

模拟9 T3 &#xff08;COGS上也有&#xff0c;链接http://218.28.19.228/cogs/problem/problem.php?pid1428&#xff09; 题目描述 输入a&#xff0c;p&#xff0c;求最小正整数x&#xff0c;使得a^x mod p 1。 分析 神奇的欧拉定理&#xff08;对于gcd&#xff08;a&#xf…

《MySQL——group by使用tips》

1、如果对group by语句结果没有排序要求&#xff0c;在语句后面加order by null 2、尽量让group by 过程用上索引&#xff0c;确认方法是explain结果里没有Using temporary 和Using filesort 3、如果group by 需要统计的数据量不大&#xff0c;尽量只使用内存临时表&#xff…

css中变量_CSS中的变量

css中变量CSS | 变数 (CSS | Variables) CSS variables allow you to create reusable values that can be used throughout a CSS document. CSS变量允许您创建可在CSS文档中使用的可重用值。 In CSS variable, function var() allows CSS variables to be accessed. 在CSS变…

位图像素的颜色 携程编程大赛hdu

位图像素的颜色 Time Limit: 2000/1000 MS (Java/Others) MemoryLimit: 32768/32768 K (Java/Others) Total Submission(s): 0 Accepted Submission(s): 0 Problem Description 有一个在位图上画出矩形程序&#xff0c;一开始位图都被初始化为白色&#xff08;RGB颜色表示…

《MySQL——InnoDB与Memory以及临时表》

InooDB与Memory 数据组织方式不同&#xff1a; InnoDB引擎把数据放在主键索引上&#xff0c;其他索引上保存的是主键id。为索引组织表Memory引擎把数据单独存放&#xff0c;索引上保存数据位置。为堆组织表 典型不同处&#xff1a; 1、InnoDB表的数据总是有序存放的&#x…

Oracle 用户 profile 属性 转

--查看profile 内容 select * from dba_profiles where profilePF_EAGLE; --查看用户的profiles select username,profile from dba_users; --查看是否启用动态资源限制参数 SHOW PARAMETER RESOURCE_LIMIT; --启用限制 ALTER SYSTEM SET RESOURCE_LIMITTRUE SCOPEBOTH; --创建…

CUL8R的完整形式是什么?

CUL8R&#xff1a;稍后再见 (CUL8R: See You Later) CUL8R is an abbreviation of "See You Later". CUL8R是“稍后见”的缩写 。 It is an expression, which is commonly used in messaging or chatting on social media networking sites like Facebook, Yahoo M…

SuperSpider——打造功能强大的爬虫利器

SuperSpider——打造功能强大的爬虫利器 博文作者&#xff1a;加菲 发布日期&#xff1a;2013-12-11 阅读次数&#xff1a;4506 博文内容&#xff1a; 1.爬虫的介绍 图1-1 爬虫&#xff08;spider) 网络爬虫(web spider)是一个自动的通过网络抓取互联网上的网页的程序&#xf…

《MySQL——关于grant赋权以及flush privileges》

先上总结图&#xff1a; 对于赋予权限或者收回权限还是创建用户&#xff0c;都会涉及两个操作&#xff1a; 1、磁盘&#xff0c;mysql.user表&#xff0c;用户行所有表示权限的字段的值的修改 2、内存&#xff0c;acl_users找到用户对应的对象&#xff0c;将access值修改 g…

对Spring的理解

1、Spring实现了工厂模式的工厂类&#xff0c;这个类名为BeanFactory实际上是一个接口&#xff0c;在程序中通常BeanFactory的子类ApplicationContext。Spring相当于一个大的工厂类&#xff0c;在其配置文件中通过<bean>元素配置用于创建实例对象的类名和实例对象的属性。…

Java中的null是什么?

As we know null is an important concept in every language not only in Java but here we will study various factors regarding null. 我们知道null在每种语言中都是重要的概念&#xff0c;不仅在Java中&#xff0c;在这里我们还将研究有关null的各种因素。 null is a ver…

《MySQL——分区表小记》

分区表的组织形式 以年份为分割方式&#xff0c;对表进行分割&#xff1a; CREATE TABLE t (ftime datetime NOT NULL,c int(11) DEFAULT NULL,KEY (ftime) ) ENGINEInnoDB DEFAULT CHARSETlatin1 PARTITION BY RANGE (YEAR(ftime)) (PARTITION p_2017 VALUES LESS THAN (201…

实战Windows下安装boost

Boost大部分组件无需编译可直接包含头文件使用&#xff0c;但还有一些库需要编译成静态库或动态库才能使用。可使用下文将提到的bjam工具&#xff1a;bjam --show-libraries 查看必须编译才能使用的库。 编译安装环境&#xff1a;Win7&#xff0c;VS2008(msvc-9.0) 1. 下载boos…