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サーバーのストレージリソースプール不足問題の解決

推薦する

最も完全なpackage.json分析

目次1. 概要2. 名前フィールド3. バージョンフィールド4. 説明フィールド5. キーワードフィ...

モバイル アプリのユーザー インターフェース設計に関する 10 のヒント

ヒント1: 集中力を保つ最高のモバイル アプリは、1 つのことを非常にうまく行うことに重点を置いてい...

シンプルな虫眼鏡効果を実現するJavaScript

大きな箱の中に写真があります。マウスをその上に置くと、半透明のマスク レイヤーが表示されます。マウス...

MySQL <> および <=> 演算子の紹介

<> 演算子機能: 等しくないことを示します。注: 「!=」演算子と同じ機能を持ちますが...

Vueはフォーム検証機能を実装します

この記事では主に、NUXT の validate メソッドに基づいてフォーム検証を実装する方法につい...

WeChatアプレットbindtapとcatchtapの違いの詳細な説明

目次1. イベントとは何ですか? 2. イベントの使い方3. バインドタップとキャッチタップの違い4...

CSS3 テキストアニメーション効果

効果 html <div class="sp-container">...

Docker クロスホストネットワーク (オーバーレイ) の実装

1. Dockerのホスト間通信Docker クロスホスト ネットワーク ソリューションには以下が含...

IE環境では、divの高さはフォントの高さよりも大きくなければならないと規定されています。

コードをコピーコードは次のとおりです。 <div class="content&qu...

mysql 解凍パッケージの基本インストールチュートリアル

新しいコンピューターに変更したので、すべての環境を新しいコンピューター上で設定する必要があります。ふ...

パフォーマンス負荷診断にMySQLシステムデータベースを使用する方法

ある達人がかつて、自分の妻のことを知るのと同じくらい、自分が管理するデータベースのことを知るべきだと...

vue3 コンポーネントでの v-model の使用と詳細な説明

目次v-model 入力で双方向バインディングデータを使用するコンポーネント内の v-model他の...

LinuxにKafkaをインストールする

目次1.1 前提条件としてのJava環境1.2 Zookeeperのインストールと設定1.3 Kaf...

CSS を使用して複数の方法で下揃えを実装するサンプル コード

会社のビジネス要件により、次の図の赤い領域の効果を達成する必要があります。 効果の説明: 1. 赤い...

Linux で FastDFS を使用してイメージ サーバーを構築する

目次サーバー計画1. システムコンポーネントをインストールする2. fastdfsをインストールする...