Mysql 8.0.18 hash join测试(推荐)
HashJoin
HashJoin不需要任何索引来执行,并且在大多数情况下比当前的块嵌套循环算法更有效。
下面通过实例代码给大家介绍Mysql8.0.18hashjoin测试,具体内容如下所示:
CREATETABLECOLUMNS_hjasselect*frominformation_schema.`COLUMNS`; INSERTINTOCOLUMNSSELECT*FROMCOLUMNS;--最后一次插入25万行 CREATETABLECOLUMNS_hj2asselect*frominformation_schema.`COLUMNS`;
explainformat=tree SELECT COUNT(c1.PRIVILEGES), SUM(c1.ordinal_position) FROM COLUMNS_hjc1, COLUMNS_hj2c2 WHERE c1.table_name=c2.table_name ANDc1.column_name=c2.column_name GROUPBY c1.table_name, c1.column_name ORDERBY c1.table_name, c1.column_name;
必须使用format=tree(8.0.16的新特性)才能查看hashjoin的执行计划:
->Sort:.TABLE_NAME, .COLUMN_NAME ->Tablescanon ->Aggregateusingtemporarytable ->Innerhashjoin(c1.`COLUMN_NAME`=c2.`COLUMN_NAME`),(c1.`TABLE_NAME`=c2.`TABLE_NAME`)(cost=134217298.97rows=13421218) ->Tablescanonc1(cost=1.60rows=414619) ->Hash ->Tablescanonc2(cost=347.95rows=3237)
setjoin_buffer_size=1048576000; SELECT COUNT(c1.PRIVILEGES), SUM(c1.ordinal_position) FROM COLUMNS_hjc1, COLUMNS_hj2c2 WHERE c1.table_name=c2.table_name ANDc1.column_name=c2.column_name GROUPBY c1.table_name, c1.column_name ORDERBY c1.table_name, c1.column_name;
1.5秒左右。
再来看BNL,先创建索引(分别优化了,再对比效果才公平)。
altertablecolumns_hjdropindexidx_columns_hj; altertablecolumns_hj2dropindexidx_columns_hj2; createindexidx_columns_hjoncolumns_hj(table_name,column_name); createindexidx_columns_hj2oncolumns_hj2(table_name,column_name); ->Sort:.TABLE_NAME, .COLUMN_NAME ->Tablescanon ->Aggregateusingtemporarytable ->Nestedloopinnerjoin(cost=454325.17rows=412707) ->Filter:((c2.`TABLE_NAME`isnotnull)and(c2.`COLUMN_NAME`isnotnull))(cost=347.95rows=3237) ->Tablescanonc2(cost=347.95rows=3237) ->Indexlookuponc1usingidx_COLUMNS_hj(TABLE_NAME=c2.`TABLE_NAME`,COLUMN_NAME=c2.`COLUMN_NAME`)(cost=127.50rows=127)
大约4.5秒。可见hashjoin效果还是杠杠的。
不得不吐槽下mysql的优化器提示,貌似HASH_JOIN/NO_HASH_JOIN都不生效。
除了hash_join外,mysql8.0.3引入的SET_VAR优化器提示还是很好用的,可用来设置语句级参数(oracle支持,mariadb记得也支持了的),如下:
mysql>select/*+set_var(optimizer_switch='index_merge=off')set_var(join_buffer_size=4M)*/c_idfromcustomerlimit1;
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_depthvariables 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
总结
以上所述是小编给大家介绍的Mysql8.0.18hashjoin测试,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。