mysql 8.0.18 hash join测试(内外网首文)
oracle天杀的,8.0.19版本居然又把hash join优化器提示废弃了,卧槽,再不信你了。
CREATE TABLE COLUMNS_hj as select * from information_schema.`COLUMNS`;
INSERT INTO COLUMNS_hj SELECT * FROM COLUMNS_hj; -- 最后一次插入25万行
CREATE TABLE COLUMNS_hj2 as select * from information_schema.`COLUMNS`;
explain format=tree
SELECT
COUNT(c1. PRIVILEGES),
SUM(c1.ordinal_position)
FROM
COLUMNS_hj c1,
COLUMNS_hj2 c2
WHERE
c1.table_name = c2.table_name
AND c1.column_name = c2.column_name
GROUP BY
c1.table_name,
c1.column_name
ORDER BY
c1.table_name,
c1.column_name;
必须使用format=tree(8.0.16的新特性)才能查看hash join的执行计划:
-> Sort: <temporary>.TABLE_NAME, <temporary>.COLUMN_NAME
-> Table scan on <temporary>
-> Aggregate using temporary table
-> Inner hash join (c1.`COLUMN_NAME` = c2.`COLUMN_NAME`), (c1.`TABLE_NAME` = c2.`TABLE_NAME`) (cost=134217298.97 rows=13421218)
-> Table scan on c1 (cost=1.60 rows=414619)
-> Hash
-> Table scan on c2 (cost=347.95 rows=3237)
set join_buffer_size=1048576000;
SELECT
COUNT(c1. PRIVILEGES),
SUM(c1.ordinal_position)
FROM
COLUMNS_hj c1,
COLUMNS_hj2 c2
WHERE
c1.table_name = c2.table_name
AND c1.column_name = c2.column_name
GROUP BY
c1.table_name,
c1.column_name
ORDER BY
c1.table_name,
c1.column_name;
1.5秒左右(相比mariadb的hash join实现BNLH join来说,要稳定的多)。
再来看BNL,先创建索引(分别优化了,再对比效果才公平)。
alter table columns_hj drop index idx_columns_hj;
alter table columns_hj2 drop index idx_columns_hj2;
create index idx_columns_hj on columns_hj(table_name,column_name);
create index idx_columns_hj2 on columns_hj2(table_name,column_name);
-> Sort: <temporary>.TABLE_NAME, <temporary>.COLUMN_NAME
-> Table scan on <temporary>
-> Aggregate using temporary table
-> Nested loop inner join (cost=454325.17 rows=412707)
-> Filter: ((c2.`TABLE_NAME` is not null) and (c2.`COLUMN_NAME` is not null)) (cost=347.95 rows=3237)
-> Table scan on c2 (cost=347.95 rows=3237)
-> Index lookup on c1 using idx_COLUMNS_hj (TABLE_NAME=c2.`TABLE_NAME`, COLUMN_NAME=c2.`COLUMN_NAME`) (cost=127.50 rows=127)
大约4.5秒。可见hash join效果还是杠杠的。
不得不吐槽下mysql的优化器提示,貌似HASH_JOIN/NO_HASH_JOIN都不生效。
目前hash join仅支持普通连接hash join,不支持反连接、半连接、外连接。
2019/11/15更新:各种场景的对比,也可以参考下https://mysqlserverteam.com/hash-join-in-mysql-8/
除了hash_join外,mysql 8.0.3引入的SET_VAR优化器提示还是很好用的,可用来设置语句级参数(oracle支持,mariadb记得也支持了的),如下:
mysql> select /*+ set_var(optimizer_switch='index_merge=off') set_var(join_buffer_size=4M) */ c_id from customer limit 1;
SET_VAR支持的变量列表:
auto_increment_increment auto_increment_offset big_tables bulk_insert_buffer_size default_tmp_storage_engine div_precision_increment end_markers_in_json eq_range_index_dive_limit foreign_key_checks group_concat_max_len insert_id internal_tmp_mem_storage_engine join_buffer_size lock_wait_timeout max_error_count max_execution_time max_heap_table_size max_join_size max_length_for_sort_data max_points_in_geometry max_seeks_for_key max_sort_length optimizer_prune_level optimizer_search_depth variables optimizer_switch range_alloc_block_size range_optimizer_max_mem_size read_buffer_size read_rnd_buffer_size sort_buffer_size sql_auto_is_null sql_big_selects sql_buffer_result sql_mode sql_safe_updates sql_select_limit timestamp tmp_table_size updatable_views_with_limit unique_checks windowing_use_high_precision
mysql 8.0.18 hash join测试(内外网首文)的更多相关文章
- [20180713]关于hash join 测试中一个疑问.txt
[20180713]关于hash join 测试中一个疑问.txt --//上个星期做的测试,链接: http://blog.itpub.net/267265/viewspace-2157424/-- ...
- mysql 8.0.18 mgr 搭建及其切换
mysql 8.0.18 mgr 搭建及其切换 一.系统安装包 yum -y install make gcc-c++ cmake bison-devel ncurses-devel readline ...
- win10 安装mysql 8.0.18 解决Navicat初次连接报错
win10 安装mysql 8.0.18 解决Navicat初次连接报错 win10 安装mysql 8.0.18-winx64 一,先去官网下载mysql 安装包 https://dev.mysql ...
- mysql 8.0.18 手工安装记录
mysql 8.0.18 手工安装记录 为了日常方便,特记录如下. 一.安装系统依赖包 #.系统依赖包安装 yum -y install make gcc-c++ cmake bison-devel ...
- 如何干涉MySQL优化器使用hash join
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 前言 实验 总结 前言 数据库的优化器相当于人类的大 ...
- MySQL 8.0.18安装教程(windows 64位)
目录 1-先去官网下载点击的MySQL的下载 2-配置初始化的my.ini文件的文件3-初始化MySQL4-安装MySQL服务 + 启动MySQL 服务5-连接MySQL + 修改密码 * 第一项 ...
- MySQL 8.0.18 在 Windows Server 2019 上的安装(ZIP)公开
AskScuti MySQL : Windows Server 2019 安装 MySQL 8.0 温馨提示:为了展现我最“魅力”的一面,请用谷歌浏览器撩我. 一切就绪,点我开撩
- MySQL 8.0.18 在 Windows Server 2019 上的安装(MSI)公开
AskScuti MySQL : Windows Server 2019 安装 MySQL 8.0 温馨提示:为了展现我最“魅力”的一面,请用谷歌浏览器撩我.那个 IE 啊,我很无奈. 一切就绪,点我 ...
- MySQL 8.0.18 InnoDB Cluster 主从(MGR)完整安装配置
提示: MySQL InnoDB Cluster底层依赖Group Replication模式,至少3台机器 1. 准备3台 CentOS Linux 7 (Core), 修改各主机名:db-hos ...
随机推荐
- 医疗行业预测性产品的质量如何把关?MES系统帮大忙
作为行业细分的医疗设备制造正在向工业4.0快速发展.它也可能仍然是世界上受监管最严格的行业之一,产品的个性化发展速度比其他行业更快. 在医疗设备行业中,由于需求或由于市场特定的规定,产品越来越多地定制 ...
- Solr基础理论【倒排索引,模糊查询】
一.简介 现有的许多不同类型 的技术系统,如关系型数据库.键值存储.操作磁盘文件的map-reduce[映射-规约]引擎.图数据库等,都是为了帮助用户解决颇具挑战性的数据存储与检索问题而设计的.而搜索 ...
- DLL Injection with Delphi(转载)
原始链接 I had recently spent some time playing around with the simple to use DelphiDetours package from ...
- Windos7 安装 thumbor 遇到的python版本问题
(py36) C:\Users\Administrator>thumbor --port= Traceback (most recent call last): File , in _run_m ...
- js动画--链式运动
前面几节我们只是讲述了一种运动,这节课我将讲述链式运动:就以一个动作接着一个动作完成. 对于这个实现,我们只需要改变一下就可以实现了,设置一个回调函数. var timer; window.onloa ...
- P1850 换教室[dp+期望]
流下了不会概率的眼泪,由于不会概率,转移少写了点东西... 这个dp很简单,就是一个普通的线性dp加点期望.(刚开始写这道题时信笔写下) \(dp[0/1][i][j]\)表示到第\(i\)个时间段时 ...
- python应用-彩票随机码的输出
""" 双色球-6个红色球(1-33)和一个蓝色球(1-16) """ from random import randint def sel ...
- Gym - 247731E :room(最小费用流裸题)
题意:有N个宿舍(N<200),给出第一年每个宿舍有哪4个同学.现在给出N个4元组y[][4],表示这4个人想住一起,问最少多少人需要换宿舍. 思路:费用流,每个4元组y[]到每个宿舍连边,流量 ...
- 下载文件的Restful接口的前端实现
背景介绍 后端是springboot框架,接口是restful风格接口,需求是异步实现一个文件下载,该文件是动态生成的,以流的方式返回给前端.存在的问题是,ajax不支持post方式传参数,并触发浏览 ...
- 《DSL》笔记一、什么是DSL(转)
1.1.问题域与解答域 1.1.1.什么是DSL? DSL(Domain-Specific Language)全称领域专用语言,就是专门用户特定领域的语言,看着概念觉得挺高大上的,其实很简单,就是专门 ...