MySQLは効率的なインデックス例分析を確立する

MySQLは効率的なインデックス例分析を確立する

この記事では、例を使用して、MySQL で効率的なインデックスを作成する方法について説明します。ご参考までに、詳細は以下の通りです。

理想的なインデックスを作成するにはどうすればよいでしょうか?

  • クエリ頻度
  • 差別
  • インデックスの長さ
  • フィールドを上書きする

差別

ユーザーが100万人いると仮定すると、性別は基本的に男性が50万人、女性が50万人なので、差別化は低いです。

ショート丈

インデックスの長さは、インデックス ファイルのサイズ、追加、削除、変更の速度に直接影響し、間接的にクエリ速度に影響します (より多くのメモリを占有します)。

高い識別力、短い長さ

質問: 識別度を高くし、長さを短くするとどうなるでしょうか?

回答:列内の値を左から右に切り取ることでインデックスを作成できます。

(1)カットが短いほど、繰り返しが多くなり、差別化が低くなり、インデックス効果が悪くなります。 (2)カットが長いほど、繰り返しが少なくなり、差別化が高くなり、インデックス効果が高くなりますが、影響が大きくなります。追加と削除が遅くなり、クエリ速度に影響します。

したがって、識別と長さの間でバランスを取る必要があります。従来の方法: 異なる長さにカットし、その識別力をテストします。

13,324 件のレコードを含む英語レベル 4 の語彙テーブルがあるとします。名前フィールドにインデックスを追加するにはどうすればよいでしょうか。

這里寫圖片描述

差別をどのように計算しますか?

単語の最初の重複しない数字を抽出します。

dictからcount(distinct left(name,1))を選択します

合計数量:

辞書からcount(*)を選択

区別: 一意の数/合計数、SQL ステートメントは次のようになります。

(select count(distinct left(name,1)) from dict) / (select count(*) from dict) を rate として選択します。

次に、次の手順に従って、他の長さに対応する識別を調べます。このグラフを見ると、長さが 11 の場合、繰り返し率はわずか 1% であることがわかります。11 ビットのインデックスを作成することを検討できます。

這里寫圖片描述

テーブル辞書を変更し、インデックス名 name(11) を追加します。

左接頭辞は区別が難しい

左プレフィックスが判別しにくい列のインデックスを作成するためのヒント

URL列など

http://www.baidu.com
http://www.web-bc.cn

列の最初の 11 文字が同じなので区別が困難です。この問題を解決するには、次の 2 つの方法を使用できます。

(1)列の内容を逆順に保存し、インデックスを作成する

moc.udiab.www//:ptth
nc.cb-bew.www//://ptth

このように左接頭辞は優れた識別力を持つ

(2)疑似ハッシュインデックス効果

urlとurl_hashの両方の列を保存する

#テーブルを作成する create table t10 (
id int 主キー、
url char(60) nullでないデフォルト ''
);
#t10値に挿入
(1,'http://www.baidu.com')、
(2、「http://www.sina.com」)、
(3,'http://www.sohu.com.cn')、
(4,'http://www.onlinedown.net')、
(5、「http://www.gov.cn」);
# テーブル構造を変更し、urlcrc 列を追加します。alter table t10 add urlcrc int unsigned not null;

保存するときは、URLに対応するCRC32コードをデータベースに挿入し、urlcrcフィールドに従ってインデックスを作成します。検索するときは、ビジネスレイヤーで対応するURLをCRC32に変換して検索し、インデックスを使用できます。

crc の結果は 32 ビット int 符号なし数値なので、データが 40 億を超えると重複が発生しますが、それだけの価値はあります。(インデックスの長さは int4 バイトです)

複数列インデックス

複数列インデックスに関する考慮事項 - 列クエリの頻度、列の差別化、実際のビジネスシナリオとの組み合わせ

ecshop を例にとると、goods テーブルの cat_id と brand_id は複数列のインデックスです。差別化の観点から見ると、brand_id の方が差別化が高くなります。ただし、モールの実際のビジネスでは、顧客は一般的に最初に大きなカテゴリ -> 小さなカテゴリ -> ブランドの順に選択し、最終的に 2 つのインデックスを作成することを選択します。

(1) インデックス(cat_id,brand_id)
(2) インデックス(cat_id,shop_price)

(3)インデックス(cat_id、brand_id、shop_price)を追加することもできます。3つの冗長インデックス

しかし、(3)の最初の2つの列は(1)の最初の2つの列と同じなので、(1)を削除して2つのインデックスを作成できます。

index(cat_id,price)およびindex(cat_id,brand_id,shop_price);

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL インデックス操作スキルの概要」、「MySQL 共通関数の概要」、「MySQL ログ操作スキルの概要」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキルの概要」、および「MySQL データベース ロック関連スキルの概要」。

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL 重複インデックスと冗長インデックスの例の分析
  • MySQL インデックス カバレッジの例の分析
  • MySQL インデックスがソートに与える影響の分析例
  • MySQL のインデックスにおける NULL の影響についての詳細な説明
  • MySQL インデックスの原理と最適化の詳細な説明
  • ユニークインデックスの S ロックと X ロックによる MySQL デッドロック ルーチンの理解
  • mysql インデックスの追加 mysql インデックスの作成方法
  • MySQL インデックスタイプの概要と使用上のヒントと注意事項
  • MySQL でインデックスを表示、作成、削除する方法
  • MySQL インデックス作成方法、構文構造、および例
  • MySQL クラスター化インデックスのページ分割原理の分析例

<<:  Docker が占有するディスク領域をクリーンアップする方法

>>:  WeChat アプレット計算機の例

推薦する

格納可能なセカンダリメニューを実装するための JavaScript

JavaScriptで格納可能なセカンダリメニューを実装するための具体的なコードは参考までに。具体...

SQLと各種NoSQLデータベースの使用シナリオの説明

SQL はメイントランクです。なぜ私はこのように理解するのでしょうか。技術的な観点からリレーショナル...

Dockerはコンテナポートバインディングのローカルポートを実装します

今日、イメージを起動した後、HTTP リクエスト経由でアクセスできないという小さな問題が発生しました...

Vue で SuperMap を使用する練習

目次序文関連資料Vue プロジェクトが 2 次元ハイパーグラフを導入ハイパーグラフ 2D ケース引用...

史上最も簡単な MySQL データのバックアップと復元のチュートリアル (パート 2) (パート 37)

データのバックアップと復元パート3の詳細は次のとおりです基本的な概念:バックアップ、現在のデータまた...

Linux で実行中のすべてのプロセスを表示する方法

ps コマンドを使用できます。プロセスの PID など、現在実行中のプロセスに関する関連情報を表示で...

HTML 選択オプションの基本的な理解と使用

JavaScript での HTML (選択オプション) の詳細な説明1. 基本的な理解:コードをコ...

検証例 MySQL | 同じ値を持つフィールドを更新すると、binlog に記録されます

1. はじめに数日前、開発仲間から、フィールドを同じ値に更新すると binlog が記録されるかどう...

Vue3 のリアクティブ関数 toRef 関数 ref 関数の紹介

目次リアクティブ機能使用法: toRef 関数 (理解するだけ)使用法: ref関数レスポンシブデー...

Oracle と MySQL の高可用性ソリューションの比較分析

Oracle と MySQL の高可用性ソリューションについては、以前からまとめたいと思っていたので...

MySQLテクノロジーにおけるInnoDBロックの詳細な説明

目次序文1. ロックとは何ですか? 2. InnoDBストレージエンジンのロック2.1 ロックの種類...

Linux ファイルを分割するための split コマンドの詳細な説明

いくつかの簡単な Linux コマンドを使用すると、ストレージまたは電子メールの添付ファイルのサイズ...

ドキュメントの場所の比較

<br />2 年前に PPK が投稿した素晴らしいブログ記事では、contains()...

MySQLで論理SQLを置き換える際の落とし穴を回避する方法の詳細な説明

重複キーの置換と挿入の違い置換の使用法競合がない場合、挿入と同等となり、他の列のデフォルト値が使用さ...

きれいなJavaScriptコードの書き方を教える記事

目次1. 変数意味のある名前を使う不必要なコンテキストを追加しないようにするハードコードされた値を避...