ハッシュ結合 ハッシュ結合は実行にインデックスを必要とせず、ほとんどの場合、現在のブロックネストループアルゴリズムよりも効率的です。 次のサンプルコードは、MySQL 8.0.18 ハッシュ結合テストを紹介しています。具体的な内容は次のとおりです。 information_schema.`COLUMNS` から select * として COLUMNS_hj テーブルを作成します。 INSERT INTO COLUMNS SELECT * FROM COLUMNS; -- 最後に 250,000 行を挿入します CREATE TABLE COLUMNS_hj2 as select * from information_schema.`COLUMNS`; format=tree の説明 選択 COUNT(c1.権限)、 SUM(c1.序数位置) から 列_hj c1、 列_hj2 c2 どこ c1.テーブル名 = c2.テーブル名 かつ c1.列名 = c2.列名 グループ化 c1.テーブル名、 c1.列名 注文する c1.テーブル名、 c1.列名; ハッシュ結合の実行プランを表示するには、format=tree (8.0.16 の新機能) を使用する必要があります。 -> 並べ替え: <一時>.TABLE_NAME、<一時>.COLUMN_NAME -> <temporary> のテーブルスキャン -> 一時テーブルを使用して集計する -> 内部ハッシュ結合 (c1.`COLUMN_NAME` = c2.`COLUMN_NAME`)、(c1.`TABLE_NAME` = c2.`TABLE_NAME`) (コスト = 134217298.97 行 = 13421218) -> c1 のテーブルスキャン (コスト = 1.60 行 = 414619) -> ハッシュ -> c2 のテーブルスキャン (コスト = 347.95 行 = 3237) join_buffer_size=1048576000 に設定します。 選択 COUNT(c1.権限)、 SUM(c1.序数位置) から 列_hj c1、 列_hj2 c2 どこ c1.テーブル名 = c2.テーブル名 かつ c1.列名 = c2.列名 グループ化 c1.テーブル名、 c1.列名 注文する c1.テーブル名、 c1.列名; 約1.5秒です。
テーブル columns_hj を変更し、インデックス idx_columns_hj を削除します。 テーブル columns_hj2 を変更し、インデックス idx_columns_hj2 を削除します。 columns_hj(table_name,column_name) にインデックス idx_columns_hj を作成します。 columns_hj2(table_name,column_name) にインデックス idx_columns_hj2 を作成します。 -> 並べ替え: <一時>.TABLE_NAME、<一時>.COLUMN_NAME -> <temporary> のテーブルスキャン -> 一時テーブルを使用して集計する -> ネストされたループ内部結合 (コスト = 454325.17 行 = 412707) -> フィルター: ((c2.`TABLE_NAME` は null ではありません) かつ (c2.`COLUMN_NAME` は null ではありません)) (コスト = 347.95 行 = 3237) -> c2 のテーブルスキャン (コスト = 347.95 行 = 3237) -> idx_COLUMNS_hj を使用して c1 のインデックス検索 (TABLE_NAME=c2.`TABLE_NAME`、COLUMN_NAME=c2.`COLUMN_NAME`) (コスト = 127.50 行 = 127) 約4.5秒です。ハッシュ結合の効果は依然として非常に良好であることがわかります。 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; SET_VAR でサポートされる変数のリスト: 自動増分 自動増分オフセット 大きなテーブル 一括挿入バッファサイズ デフォルトのtmpストレージエンジン div_precision_increment json の終了マーカー 等価範囲インデックスダイブ制限 外部キーチェック グループ連結最大長 挿入ID 内部tmpメモリストレージエンジン 結合バッファサイズ ロック待ちタイムアウト 最大エラー数 最大実行時間 最大ヒープテーブルサイズ 最大結合サイズ ソートデータの最大長 ジオメトリ内の最大ポイント数 キーの最大シーク数 最大ソート長 最適化レベル optimizer_search_depth 変数 オプティマイザースイッチ 範囲割り当てブロックサイズ 範囲オプティマイザの最大メモリサイズ 読み取りバッファサイズ 読み取りバッファサイズ ソートバッファサイズ sql_auto_is_null sql_big_selects SQLバッファ結果 SQLモード sql_safe_updates sql_select_limit タイムスタンプ tmp_テーブルサイズ 制限付きで更新可能なビュー ユニークチェック ウィンドウ使用高精度 要約する 上記は編集者が紹介したMysql 8.0.18ハッシュ結合テストです。皆様のお役に立てれば幸いです。ご質問がございましたら、メッセージを残してください。編集者がすぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。 以下もご興味があるかもしれません:
|
<<: Hyper-V なしで Windows 10 を動作させるソリューション
>>: プロジェクトにおけるVue3のロジック抽出とフィールド表示についての簡単な説明
今日、Baiduのページで練習していたところ、検索ボックスとボタンの余白とパディングの値が0に設定さ...
目次1. 短絡判定2. オプション連鎖演算子 (?) 3. ヌル合体演算子 (??) 4. 終了関数...
成熟したデータベース アーキテクチャは、最初から高可用性、高スケーラビリティなどの機能を備えて設計さ...
Nexus は RestApi を提供していますが、一部の API はまだ Groovy と組み合わ...
目次1. 使用2. メッセージポップアップウィンドウが繰り返し表示される問題を解決する1. 使用Vu...
bmi ボイジャーピッチフォークアルスター食料品店チャウ真/斜めポスタこれは偽のDIYですクリエイテ...
目次概要1. パスモジュール2. モジュールまで3. fsモジュール4. イベントモジュール5. h...
目次序文グローバルロック完全なデータベース論理バックアップFTWRL と set global re...
CAST関数前回の記事では、型変換を表示するために使用する CAST 関数について説明しました。暗黙...
序文: Integer は MySQL で最もよく使用されるフィールド型の 1 つで、通常は整数を格...
序文MySQL データベースのデフォルトのデータベース ファイルは /var/lib/mysql に...
1. SSHリモート管理SSH はセキュア チャネル プロトコルであり、主にリモート ログイン、リモ...
目次リスナー1.ウォッチエフェクト2.見る1.1 聴くための最初の方法1.2 聞く2つ目の方法1.3...
バックグラウンド管理プロジェクトを行う際には、リッチテキストエディタがよく使用されます。ここでは、非...
開発の背景:最近、私はバッチ データを MySQL データベースにインポートする機能に取り組んでいま...