MySQL カーディナリティ統計の簡単な分析

MySQL カーディナリティ統計の簡単な分析

1. カーディナリティとは何ですか?
カーディナリティとは、MySQL テーブルの列内の異なる値の数を指します。

このタイプのインデックスが一意である場合、カーディナリティ = 行数になります。

この列が性別で、列挙型に男性と女性のみが含まれる場合、そのカーディナリティは2です。

カーディナリティが高いほど、列をインデックスする価値が高くなります。 MySQL 実行プランでは、カーディナリティに基づいてインデックスも選択されます。

テーブル内の各列のカーディナリティは、次のように確認できます。

次の典型的な例を見てみましょう。
性別という列があります。性別列に格納される値は男性か女性のいずれかであり、その最大カーディナリティは 2 です。
性別のインデックスを作成する必要はありません。性別に基づくクエリの速度を向上させるために、MySQL は選択した新しいインデックスに対してまったく新しい B+ ツリーを作成するからです。しかし、性別には 2 つの値しかありません。MySQL の場合、指定した列に B+Tree インデックスを作成しても、実際にクエリを実行すると、バイナリ クエリは最大で 1 つしか実行されず、残りの操作はトラバーサルのみ実行できるため、性別にインデックスを作成しても意味がありません。

2. InnoDB はいつカーディナリティを更新しますか?
パラメータ: innodb_stats_auto_recalc は、MySQL がこの永続情報を積極的に再計算するかどうかを制御します。デフォルトは、true の場合は 1、false の場合は 0 です。
デフォルトでは、テーブル内の行が 10% 以上変更されると、カーディナリティ情報が再計算されます。

3. ベース数は推定される

ベース番号はリアルタイムで更新されません。そしてそれはサンプリングを通じて推定された値です!

ベースの式が何であるかについては、それは重要ではないかもしれません。

これはデータ ページをランダムにサンプリングして計算された推定値であることを理解することが重要です。

ランダムにサンプリングされるページの数は、パラメータ innodb_stats_persistent_sample_pages で設定でき、デフォルト値は 20 です。

つまり、基本値は正確ではなく、計算結果も毎回大きく異なる可能性があります。

4. 永続的なカーディナリティ

パラメータ innodb_stats_persistent を使用して、カーディナリティが永続化されるかどうかを制御できます。デフォルト設定はオフです。

もちろん、単一のテーブルに対して STATS_PERSISTENT=1 を設定すると、その innodb_stats_persistent は自動的に有効になります。

これを有効にする利点は、MySQL を再起動してもこの値が再計算されないため、再起動プロセスが高速化されることです。

5. ベースをアクティブに更新するにはどうすればいいですか?

次の SQL を実行すると、InnoDB がカーディナリティを更新します (カーディナリティが更新されることに気付いていない場合でも)。

そのため、ビジネスピークの少ない時間帯を選ぶようにしてください

テーブルtableNameを分析します。

サンプル数が少なすぎると、計算された基数は非常に間違ったものになります。これにより、MySQL オプティマイザが間違ったインデックスを選択する可能性が高くなります。ここで値を適切に増やすことができます。ただし、あまり大きくしすぎると、ANALYZE TABLE の実行が遅くなる可能性があります。

逆に、ANALYZE TABLE の実行は遅すぎます。パラメータ innodb_stats_persistent_sample_pages の値を適切に調整できます。ただし、これにより基数の計算が不正確になる可能性があります。

両者の関係をバランスさせる方法がない場合。 ANALYZE TABLE の複雑さを軽減するには、テーブル内のインデックス列の数を減らすか、パーティションの数を制限することを検討してください。主キー列は各非一意のインデックスに追加されるため、テーブルの主キーの列数も重要です。

参照:

永続統計

テーブルの複雑さを分析する

上記は、MySQL カーディナリティ統計の詳細の簡単な分析です。MySQL カーディナリティ統計の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL ダーティ ページ フラッシュとテーブル スペースの縮小の原理の分析
  • MySQL関連のツールをいくつかお勧めします
  • MySQL の lru リンク リストの簡単な分析
  • MySQL クエリ キャッシュとバッファ プール
  • メニューノードのすべての子ノードを再帰的に検索する MySQL メソッド
  • MySQL テーブルスペースとは何ですか?
  • MySQL の遅いクエリを見つける方法
  • MySQL フラッシュリストとダーティページフラッシュメカニズム

<<:  JavaScript ウェブページ入門開発詳細説明

>>:  Dockerサーバーのストレージリソースプール不足問題の解決

推薦する

MySQL 8.0.24 バージョンのインストールと設定方法のグラフィックチュートリアル

この記事ではMySQL 8.0.24バージョンのインストールと設定方法を記録し、皆さんと共有しますM...

この記事では、6つの負荷分散技術の実装方法をまとめます(要約)

ロード バランシングは、サーバー クラスタの展開でよく使用されるデバイスです。マシンのパフォーマンス...

MySQL マスタースレーブレプリケーションの実践の詳細説明 - ログポイントに基づくレプリケーション

ログポイントベースのレプリケーション1. マスターデータベースとスレーブデータベースに専用のレプリケ...

JavaScript で二分探索木を実装する

JavaScriptでの検索二分木実装は参考までに。具体的な内容は以下のとおりです。バイナリ検索木 ...

ウェブページを最適化してメモリとCPUの使用率を削減

一部の Web ページは大きく見えなくても開くのに非常に時間がかかる場合があります。一方、他の We...

特定のシンボルで複数の行と列に分割するMySQLの例

一部の障害コード テーブルでは、履歴またはパフォーマンス上の理由から、次の設計パターンが使用されます...

MySQL の lru リンク リストの簡単な分析

1. 従来のLRUリンクリストについて簡単に説明するLRU:最も最近使われなかったものLRU リンク...

Javascript 共通高階関数の詳細

目次1. 一般的な高階関数1.1、フィルター1.2、地図1.3、減らすHigher Order fu...

win2008 サーバー セキュリティ設定の展開ドキュメント (推奨)

私は新年を迎える前からプロジェクトに取り組んでいましたが、ここ数日で、新しいサーバー用に新しく増設し...

Web デザインの経験: 独善的な Web デザイナー

1. ゴミかクラシックか? Web テクノロジーは急速に更新されており、Web サイトのインターフェ...

Dockerコンテナを作成、起動、停止する方法

1. コンテナとは、独立して実行されるアプリケーション、またはアプリケーションのグループとその動作環...

VMware インストール後に仮想ネットワーク カードが表示されない問題について

1 問題の説明: 1.1 Windows 10 に VMware を初めてインストールする場合、また...

Zabbix でフィルターを使用して監視を実装する方法

最近、監視機器の作業をしていたとき、ポートがダウンしているというアラームが常に出ていました。データを...

Win10でIIS10を構成し、ASPプログラムのデバッグをサポートする手順

マイクロソフトIIS (Internet Information Server) は、Microso...

両端揃えレイアウトを実現する CSS 列のサンプルコード

1. 堂々巡りいろいろ試行錯誤した結果、均等割り付けレイアウトを実現する最も簡単な方法は CSS ...