Mysql 8.0.18 hash join测试(推荐)
16lz
2021-12-20
Hash Join
Hash Join 不需要任何索引来执行,并且在大多数情况下比当前的块嵌套循环算法更有效。
下面通过实例代码给大家介绍Mysql 8.0.18 hash join测试,具体内容如下所示:
CREATE TABLE COLUMNS_hj as select * from information_schema.`COLUMNS`;INSERT INTO COLUMNS SELECT * FROM COLUMNS; -- 最后一次插入25万行CREATE TABLE COLUMNS_hj2 as select * from information_schema.`COLUMNS`;
-> 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)
再来看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)
不得不吐槽下mysql的优化器提示,貌似HASH_JOIN/NO_HASH_JOIN都不生效。
除了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;
auto_increment_incrementauto_increment_offsetbig_tablesbulk_insert_buffer_sizedefault_tmp_storage_enginediv_precision_incrementend_markers_in_jsoneq_range_index_dive_limitforeign_key_checksgroup_concat_max_leninsert_idinternal_tmp_mem_storage_enginejoin_buffer_sizelock_wait_timeoutmax_error_countmax_execution_timemax_heap_table_sizemax_join_sizemax_length_for_sort_datamax_points_in_geometrymax_seeks_for_keymax_sort_lengthoptimizer_prune_leveloptimizer_search_depth variablesoptimizer_switchrange_alloc_block_sizerange_optimizer_max_mem_sizeread_buffer_sizeread_rnd_buffer_sizesort_buffer_sizesql_auto_is_nullsql_big_selectssql_buffer_resultsql_modesql_safe_updatessql_select_limittimestamptmp_table_sizeupdatable_views_with_limitunique_checkswindowing_use_high_precision
更多相关文章
- MySQL系列多表连接查询92及99语法示例详解教程
- Linux下MYSQL 5.7 找回root密码的问题(亲测可用)
- MySQL 什么时候使用INNER JOIN 或 LEFT JOIN
- 细数Android(安卓)Studio中使用junit4测试框架中的坑
- android 下写文件性能测试
- android 单元测试
- Android(安卓)-- Android(安卓)JUint 与 Sqlite
- Android(安卓)单元测试小总结
- 使用uiautomatorviewer和uiautomator来做android的UI测试