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 の日付関数と日付変換およびフォーマット関数

MySQL は、膨大なユーザーベースを持つ無料のリレーショナル データベースです。この記事では、My...

JavaScript でプロパティハイジャックを実装する方法 defineProperty

目次序文記述子getとsetの詳細な説明オブジェクトの属性の乗っ取りオブジェクトのすべてのプロパティ...

MySQL 制約の種類と例

制約制約によりデータの整合性と一貫性が確保される制約はテーブルレベルの制約と列レベルの制約に分けられ...

CSS3はシームレスなスクロールと手ぶれ防止を実現します

質問画像とテキストのシームレスなスクロールは、一般的に携帯電話では良い効果をもたらしますが、一部のモ...

歴史的な Linux 画像処理および修復ソリューション

従来の Linux イメージで作成された ECS クラウド サーバーには、NTP と YUM が設定...

MySQLリモート接続失敗の解決策

以前、MySQLがローカルでは接続できるのにリモートでは接続できないという問題に遭遇したことがありま...

Linux/CentOS サーバー セキュリティ構成の一般ガイド

Linux はオープン システムです。インターネット上には、既成のプログラムやツールが多数存在します...

MySQL のスローログ監視の誤報問題の分析と解決

以前は、さまざまな理由により、一部のアラームは真剣に受け止められませんでした。最近、休暇中に、すぐに...

MySQLトリガーの使用と注意すべき点

目次トリガーについてトリガーの使用トリガーを作成するトリガーを表示トリガーの削除使用上の注意新旧の違...

MySQL の遅いクエリ操作の例の分析 [有効化、テスト、確認など]

この記事では、MySQL のスロー クエリ操作について例を挙げて説明します。ご参考までに、詳細は以下...

Windows 2019 アクティベーション チュートリアル (Office2019)

数日前、Server2019の正式版がリリースされたことを知り、面白半分でインストールしてみることに...

マインスイーパゲームを実装するための jQuery プラグイン (2)

この記事では、jQueryプラグインを使用してマインスイーパゲームを実装する2番目の記事を参考までに...

両端の CSS レイアウトのサンプルコード (親の負のマージンを使用)

最近、開発中に両端が揃ったレイアウトに遭遇しました。レイアウトはパーセンテージに基づいていました。以...

W3C標準に準拠したHTML標準で注意すべき点を詳細に解説

XML/HTML コードコンテンツをクリップボードにコピー<!DOCTYPE html PUB...

jsはポップアップウィンドウをクリックすることでポップアップログインボックスを実装します

この記事では、ポップアップウィンドウをクリックしたときにポップアップログインボックスを実現するための...