MySQL Join算法与调优白皮书(一)

MySQL Join算法与调优白皮书(二)

MySQL Join算法与调优白皮书(三)

MySQL Join算法与调优白皮书(四)

MariaDB Join

MySQL数据库虽然提供了BKA Join来优化传统的JOIN算法,的确在一定程度上可以提升JOIN的速度。但不可否认的是,仍然有许多用户对于Hash Join算法有着强烈的需求。Hash Join不需要任何的索引,通过扫描表就能快速地进行JOIN查询,通过利用磁盘的带宽带最大程度的解决大数据量下的JOIN问题。

MariaDB支持Classic Hash Join算法,该算法不同于Oracle的Grace Hash Join,但是也是通过Hash来进行连接,不需要索引,可充分利用磁盘的带宽。

Classic Hash Join

其实MariaDB的Classic Hash Join和Block Nested Loop Join算法非常类似(Classic Hash Join也成为Block Nested Loop Hash Join),但并不是直接通过进行JOIN的键值进行比较,而是根据JoinBuffer中的对象创建哈希表,内表通过哈希算法进行查找,从而在Block Nested Loop Join算法的基础上,又进一步减少了内表的比较次数,从而提升JOIN的查询性能。过程如下图所示:

同样地,如果Join Buffer能够缓存所有驱动表(外表)的查询列,那么驱动表和内表的扫描次数都将只有1次,并且比较的次数也只是内表记录数(假设哈希算法冲突为0)。

Classic Hash Join和BKA Join算法一样,需要强制开启,优化器无法做自动的选择,这点也是目前MariaDB和MySQL数据库都存在的问题。但是,MySQL团队已经在重构优化器模块,相信不久的将来,这些问题将很快得到解决。

最后,各JOIN算法成本之间的比较如下表所示:

开销统计

SNLJ

INLJ

BNLJ

BNLJH

外表扫描次数:O

1

1

1

1

内表扫描次数:I

R

0

R*used_column_size/ join_buffer_size + 1

R*used_column_size/ join_buffer_size + 1

读取记录数:R

R + S*R

R + Smatch

R + S*I

R + S*I

Join比较次数:M

S*R

R * IndexHeight

S*R

S/I

回表读取记录次数:F

0

Smatch (if possible)

0

0

Hash Join算法虽好,但是仅能用于等值连接,非等值连接的JOIN查询,其就显得无能为力了。另外,创建哈希表也是费时的工作,但是一旦建立完成后,其就能大幅提升JOIN的速度。所以通常情况下,大表之间的JOIN,Hash Join算法会比较有优势。小表通过索引查询,利用BKA Join就已经能很好的完成查询。

总结

本文介绍了MySQL数据库的各类JOIN算法,其中有Index Nested-Loop Join、Block Nested-Loop Join、Batched Key Access Join算法,最后还介绍了MariaDB的Classic HashJoin算法。通过本文,用户可以发现,虽然MySQL在JOIN算法的支持力度上远不如传统的Oracle、Microsoft SQL Server数据库,但是完成一般的JOIN查询任务是完全没有问题的。用户可能需要选对各种JOIN算法,然后根据不同算法进行参数调优,从而提升JOIN的速度。

不可否认的是MySQL的优化器现在还是存在缺陷的,如优化器无法直接选择Batched Key Access Join和Classic Hash Join。好在Oracle官方已经在重构MySQL优化器模块,相信一个更好的基于成本计算的优化器终将来临。

即使MySQL未来支持Hash Join,但是大数据的查询已经不是传统数据库适合解决的问题,未来这部分工作将越来越多地通过Hadoop这样的集群来解决。

参考文献

 

[1].https://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_join_buffer_size

[2].https://dev.mysql.com/doc/refman/5.6/en/nested-loop-joins.html

[3].https://dev.mysql.com/doc/internals/en/join-buffer-size.html

[4].https://mariadb.com/kb/en/mariadb/block-based-join-algorithms/

关于join算法的四篇文章的更多相关文章

  1. Spring Cloud第四篇 | 客户端负载均衡Ribbon

    ​ 本文是Spring Cloud专栏的第四篇文章,了解前三篇文章内容有助于更好的理解本文: ​Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cl ...

  2. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第四篇:传递表单数据

    摘要      本文将完成我们“MVC公告发布系统”的公告发布功能,以此展示在ASP.NET MVC中如何传递处理表单的数据. 前言      通过前几篇文章,我们已经能比较自如的使用ASP.NET ...

  3. Spring Cloud第十四篇 | Api网关Zuul

    ​ 本文是Spring Cloud专栏的第十四篇文章,了解前十三篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring C ...

  4. 对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章,通过文氏图 Venn diagrams 解释了SQL的Join。我觉得清楚易懂,转过来。

     对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codi ...

  5. 启xin宝app的token算法破解——frida篇(四)

    前两篇文章分析该APP的抓包.的逆向: 启xin宝app的token算法破解--抓包分析篇(一) 启xin宝app的token算法破解--逆向篇(二) 启xin宝app的token算法破解--toke ...

  6. 数据可视化之PowerQuery篇(四)二维表转一维表,看这篇文章就够了

    https://zhuanlan.zhihu.com/p/69187094 数据分析的源数据应该是规范的,而规范的其中一个标准就是数据源应该是一维表,它会让之后的数据分析工作变得简单高效. 在之前的文 ...

  7. 解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译)

    解剖SQLSERVER 第十四篇    Vardecimals 存储格式揭秘(译) http://improve.dk/how-are-vardecimals-stored/ 在这篇文章,我将深入研究 ...

  8. 第四篇 Integration Services:增量加载-Updating Rows

    本篇文章是Integration Services系列的第四篇,详细内容请参考原文. 回顾增量加载记住,在SSIS增量加载有三个使用案例:1.New rows-add rows to the dest ...

  9. 第四篇 SQL Server安全权限

    本篇文章是SQL Server安全系列的第四篇,详细内容请参考原文. 权限授予主体访问对象,以执行某些操作.SQL Server有大量你可以授予给主体的权限,你甚至可以拒绝或回收权限.这听起来有点复杂 ...

随机推荐

  1. linux故障救援

    今天手贱,误操作将/usr/lib整个文件夹都删了.但是系统内还有很多重要的文件和数据,不敢贸然重装系统. 弄了个u盘启动. 一开始整个系统只有一个分区,原系统装在这个分区里,我用u盘启动后,用分区管 ...

  2. 使用shell脚本获取虚拟机中cpu使用率(读/proc/statc)

    #!/bin/bash interval= cpu_num=`-] -c` start_idle=() start_total=() cpu_rate=() cpu_rate_file=./`host ...

  3. Pyp 替代sed,awk的文本处理工具

    Linux上文本处理工具虽不少,像cut,tr,join,split,paste,sort,uniq,sed,awk这些经典工具让人眼花缭乱,而且都太老了,使用方法都不太人性化,尤其awk,语法简直反 ...

  4. javascript中创建插入元素

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  5. oracle触发器详解(转)

    触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 8.1 触发器类型 触发器在数据库里以独立的对象存储,它与存储过 ...

  6. lintcode:递归打印数字

    题目 用递归打印数字 用递归的方法找到从1到最大的N位整数. 样例 给出 N = 1, 返回[1,2,3,4,5,6,7,8,9]. 给出 N = 2, 返回[1,2,3,4,5,6,7,8,9,10 ...

  7. Linux之SAMBA共享服务

    简述 Samba服务器可以让Windows操作系统用户访问局域网中Linux主机,就象访问网上邻居一样方便. 具有以下功能: 共享目录:在局域网上共享某个或某些目录,使得同一个网络内的Windows用 ...

  8. QSS的作用需要正确设置文件编码才能起作用

    QT这个库,无非使用OO对跨平台做了绝佳的封装,这其中的主要工作也就是比较繁琐而已,但并不多么了不起.唯独其中提供的QSS功能,让我感到十分神奇,做出来的效果实在很惊艳,而使用代码却又是如此简单,而且 ...

  9. 无刷新分页 jquery.pagination.js

     无刷新分页 jquery.pagination.js 采用Jquery无刷新分页插件jquery.pagination.js实现无刷新分页效果 1.插件参数列表 http://www.dtan.so ...

  10. RedHat6配置yum源 (32位)

    由于 redhat的yum在线更新是收费的,如果没有注册的话不能使用, 如果要使用,需将redhat的yum卸载后,重启安装,再配置其他源,以下为详细过程: 1.删除redhat原有的yum rpm ...