なぜmysqlインデックスは速いのでしょうか?
インデックスは事前にソートされており、検索時に二分探索などの高効率アルゴリズムを適用できます。一般的な逐次探索の複雑さは O(n) ですが、二分探索の複雑さは O(log2n) であり、n が非常に大きい場合、両者の効率の差は大きくなります。
このチュートリアルの動作環境: Windows7 システム、mysql8 バージョン、Dell G3 コンピューター。
Mysql はインターネット上で非常に人気のあるデータベースです。基盤となるストレージ エンジンとデータ取得エンジンの設計は非常に重要です。特に、Mysql データの格納形式とインデックスの設計がデータ全体を決定します。 Mysqlの検索性能。
インデックスの機能はデータを迅速に取得することであり、高速取得の本質はデータ構造であることはわかっています。さまざまなデータ構造を選択することで、さまざまなデータを迅速に取得できます。データベースには大量のデータが保存されており、効率的なインデックスにより時間を大幅に節約できるため、データベースでは効率的な検索アルゴリズムが非常に重要です。たとえば、次のデータ テーブルでは、Mysql がインデックス アルゴリズムを実装していない場合、id=7 のデータを見つけるには、暴力的なシーケンシャル トラバーサルのみを使用できます。id=7 のデータを見つけるには、次のようにします。このテーブルに 1000 万件のデータが格納されている場合、id=1000W のデータを検索するには 1000W 回比較することになり、この速度は許容できません。

1. Mysql インデックスの基礎となるデータ構造の選択
##ハッシュ テーブル (ハッシュ)ハッシュ テーブルは、データを高速に取得するための効果的なツールです。
ハッシュ アルゴリズム: ハッシュ アルゴリズムとも呼ばれ、ハッシュ関数を通じて任意の値 (キー) を固定長のキー アドレスに変換し、このアドレスを使用して特定のデータのデータ構造を作成します。

select * from user where id=7;


从算法时间复杂度分析来看,哈希算法时间复杂度为 O(1),检索速度非常快。比如查找 id=7 的数据,哈希索引只需要计算一次就可以获取到对应的数据,检索速度非常快。但是 Mysql 并没有采取哈希作为其底层算法,这是为什么呢?
因为考虑到数据检索有一个常用手段就是范围查找,比如以下这个 SQL 语句:
select * from user where id \>3;
针对以上这个语句,我们希望做的是找出 id>3 的数据,这是很典型的范围查找。如果使用哈希算法实现的索引,范围查找怎么做呢?一个简单的思路就是一次把所有数据找出来加载到内存,然后再在内存里筛选筛选目标范围内的数据。但是这个范围查找的方法也太笨重了,没有一点效率而言。
所以,使用哈希算法实现的索引虽然可以做到快速检索数据,但是没办法做数据高效范围查找,因此哈希索引是不适合作为 Mysql 的底层索引的数据结构。
二叉查找树(BST)
二叉查找树是一种支持数据快速查找的数据结构,如图下所示:

二叉查找树的时间复杂度是 O(lgn),比如针对上面这个二叉树结构,我们需要计算比较 3 次就可以检索到 id=7 的数据,相对于直接遍历查询省了一半的时间,从检索效率上看来是能做到高速检索的。此外二叉树的结构能不能解决哈希索引不能提供的范围查找功能呢?
答案是可以的。观察上面的图,二叉树的叶子节点都是按序排列的,从左到右依次升序排列,如果我们需要找 id>5 的数据,那我们取出节点为 6 的节点以及其右子树就可以了,范围查找也算是比较容易实现。
但是普通的二叉查找树有个致命缺点:极端情况下会退化为线性链表,二分查找也会退化为遍历查找,时间复杂退化为 O(N),检索性能急剧下降。比如以下这个情况,二叉树已经极度不平衡了,已经退化为链表了,检索速度大大降低。此时检索 id=7 的数据的所需要计算的次数已经变为 7 了。

AVL ツリーと赤黒ツリー
二分探索ツリーには不均衡の問題があるため、学者たちは自動 By を提案しました。二分木を基本的にバランスのとれた状態に保つように回転および調整することで、二分探索木の最高の検索パフォーマンスを維持できます。この考え方に基づく自己調整平衡状態を持つバイナリ ツリーには、AVL ツリーと赤黒ツリーが含まれます。 まず、赤黒ツリーについて簡単に紹介します。これは、木の形状を自動的に調整する木構造です。例えば、二分木がアンバランスな状態にある場合、赤黒ツリーは、ノードを自動的に左右に回転させ、ノードの色を変更します 基本的なバランスの取れた状態 (時間計算量が O(logn)) を維持するようにツリーの形状を調整することで、検索効率が大幅に低下することはありません。たとえば、データ ノードが 1 から 7 まで昇順に挿入されると、通常の二分探索木はリンク リストに縮退しますが、赤黒木は図に示すように基本的なバランスを維持するために木の形状を継続的に調整します。下の図のとおりです。以下の赤黒ツリーで id=7 を検索するときに比較されるノードの数は 4 ですが、それでも二分木の良好な検索効率が維持されます。 赤黒ツリーは平均的な検索効率が良く、極端な O(n) 状況はありません。赤黒ツリーは Mysql の基礎となるインデックス実装として使用できますか?実際、赤黒の木にもいくつかの問題があります。次の例を見てください。赤黒ツリーは 1 ~ 7 個のノードを順番に挿入しますが、id=7 を検索するときに計算する必要があるノードの数は 4 です。


AVL ツリーは 1 ~ 7 個のノードを順番に挿入し、id=7 のノードの比較回数は 3 回です。

AVL ツリーの利点を要約します:
- 優れた検索パフォーマンス (O(logn)) により、極端に非効率な検索状況は発生しません。
B ツリー
次の B ツリーは、ノードあたり最大 2 つのキーの保存に制限されています。キーは自動的に分割されます。たとえば、次の B ツリーには 7 個のデータが格納されています。id=7 のデータの特定の場所を知るには、2 つのノードをクエリするだけで済みます。つまり、2 つのディスク IO で指定されたデータをクエリできます。 AVL ツリー。

単一ノードのキー数制限を 6 に設定すると、7 個のデータを格納する B ツリーでは、id=7 のデータをクエリするために 2 つのディスク IO が必要になります。

16 個のデータを格納する B ツリーでは、ID=7 でデータをクエリするには 2 つのディスク IO が必要です。 -レート。 AVL ツリーと比較すると、ディスク IO の数が半分に減ります。

したがって、データベース インデックス データ構造の選択という点では、B ツリーは非常に良い選択です。要約すると、データベース インデックスとして使用される B ツリーには次の利点があります。
- #優れた検索速度、時間計算量: B ツリーの検索パフォーマンスは同等です。から O(h*logn)、そのうち、h はツリーの高さ、n は各ノードのキーワードの数です;
- 検索を高速化するために必要なディスク IO をできるだけ少なくします;
- は範囲検索をサポートできます。
- B ツリー
B ツリーと B ツリーの違いは何ですか?
まず、B ツリーは 1 つのノードにデータを格納し、B ツリーはインデックス (アドレス) を格納するため、B ツリーの 1 つのノードには大量のデータを格納できませんが、1 つのノードにはB ツリーの には多くのインデックスを格納でき、B ツリーのリーフ ノードにはすべてのデータが格納されます。
2 番目、B ツリーの葉ノードは、範囲検索を容易にするために、データ ステージでリンク リストを使用して直列に接続されます。

2. Innodb エンジンと Myisam エンジンの実装
Mysql の基礎となるデータ エンジンはプラグインの形式で設計されており、最も一般的なものは Innodb エンジンと Myisam です。ユーザーは個人のニーズに応じてカスタマイズできますが、Mysql データ テーブルの基礎となるエンジンとして別のエンジンを選択する必要があります。 B-treeはMysqlのインデックスのデータ構造として非常に適していると分析しましたが、データとインデックスをどのように構成するかについても設計が必要であり、設計思想の違いからInnodbやMyisamも登場し、それぞれが独自のパフォーマンスを発揮します。 。 MyISAM は優れたデータ検索パフォーマンスを備えていますが、トランザクション処理はサポートしていません。 Innodb の最大の特徴は、ACID 互換のトランザクション関数をサポートし、行レベルのロックをサポートしていることです。 Mysql がテーブルを作成するときにエンジンを指定できます。たとえば、次の例では、user テーブルと user2 テーブルのデータ エンジンとしてそれぞれ Myisam と Innodb が指定されています。
- frm: テーブルを作成するステートメント
# です。
-
MYD: テーブル内のデータ ファイル (myisam データ) -
MYI: テーブル内のインデックス ファイルtable (myisam インデックス)
MyISAM は非クラスター化インデックス方式、つまりデータとインデックスを使用します。ファイル上では 2 つの異なるものに分類されます。 MyISAM はテーブルを作成する際、主キーを KEY として主インデックス B ツリーを作成し、ツリーの葉ノードには対応するデータの物理アドレスが格納されます。この物理アドレスを取得したら、MyISAM データ ファイル内の特定のデータ レコードを直接見つけることができます。

Innodb エンジンの基盤となる実装 (クラスター化インデックス メソッド)
InnoDB はクラスター化インデックス メソッドであるため、データとインデックスは同じ場所に保存されます。ファイル。まず、InnoDB は左下図のように主キー ID を KEY としてインデックス B ツリーを構築し、B ツリーの葉ノードには主キー ID に対応するデータが格納されます。 select * from user_info where id=15, InnoDB 主キー ID インデックス B ツリーがクエリされ、対応する user_name='Bob' が検索されます。
これは、テーブルの作成時に InnoDB が主キー ID インデックス ツリーを自動的に構築するときです。これが、Mysql がテーブルの作成時に主キーを指定する必要がある理由です。テーブル内のフィールドにインデックスを追加するとき、InnoDB はどのようにインデックス ツリーを構築しますか?たとえば、user_name フィールドにインデックスを追加する場合、InnoDB は user_name インデックス B ツリーを作成します。user_name の KEY はノードに格納され、リーフ ノードに格納されるデータは主キー KEY になります。リーフには主キー KEY が格納されることに注意してください。主キー KEY を取得した後、InnoDB は主キー インデックス ツリーに移動し、user_name インデックス ツリーで見つかった主キー KEY に基づいて対応するデータを検索します。

- # クエリ条件として頻繁に使用されるフィールドにはインデックスを付ける必要があります。
mysql ビデオ チュートリアル ]
以上がなぜmysqlインデックスは速いのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

PHPに環境変数を設定する3つの主な方法があります。1。Php.iniを介したグローバル構成。 2。Webサーバー(apacheのsetenvやnginxのfastcgi_paramなど)を通過しました。 3。Phpスクリプトでcutenv()関数を使用します。その中でも、PHP.iniはグローバルおよび頻繁に変更された構成に適しており、Webサーバーの構成は分離する必要があるシナリオに適しており、Putenv()は一時的な変数に適しています。永続性ポリシーには、構成ファイル(PHP.INIまたはWebサーバーの構成など)、.ENVファイルにはDoTENVライブラリがロードされ、CI/CDプロセスの変数の動的注入が含まれます。セキュリティ管理に敏感な情報は、ハードコーディングを避ける必要があり、使用することをお勧めします。

PHPコンテナが自動構造をサポートできるようにするために、コアは連続統合(CI)プロセスの構成にあります。 1. DockerFileを使用して、基本的な画像、拡張インストール、依存関係管理、許可設定など、PHP環境を定義します。 2. GitlabciなどのCI/CDツールを構成し、.gitlab-ci.ymlファイルを介してビルド、テスト、展開段階を定義して、自動構造、テスト、展開を実現します。 3. phpunitなどのテストフレームワークを統合して、コードの変更後にテストが自動的に実行されることを確認します。 4. Kubernetesなどの自動展開戦略を使用して、deployment.yamlファイルを介して展開構成を定義します。 5. DockerFileを最適化し、マルチステージ構造を採用します

PHPは、インテリジェントな顧客サービスにおけるコネクタと脳センターの役割を果たし、フロントエンドの入力、データベースストレージ、外部AIサービスの接続を担当しています。 2。それを実装するとき、マルチレイヤーアーキテクチャを構築する必要があります:フロントエンドはユーザーメッセージ、PHPバックエンド前処理とルートのリクエストを受信し、最初にローカルナレッジベースと一致し、ミスはOpenAIやDialogflowなどの外部AIサービスを呼び出してインテリジェントな返信を取得します。 3.セッション管理は、コンテキストの継続性を確保するために、PHPによってMySQLおよびその他のデータベースに書き込まれます。 4.統合されたAIサービスは、Guzzleを使用してHTTPリクエストを送信し、Apikeysを安全に保存し、エラー処理と応答分析の良い仕事をする必要があります。 5.データベース設計には、セッション、メッセージ、知識ベース、ユーザーテーブルが含まれ、インデックスを合理的に構築し、セキュリティとパフォーマンスを確保し、ロボットメモリをサポートする必要があります。

独立したPHPタスクコンテナ環境の構築は、Dockerを通じて実装できます。特定の手順は次のとおりです。1。基礎としてDockerとDockerMomposeをインストールします。 2。DockerFileおよびCrontabファイルを保存するための独立したディレクトリを作成します。 3. dockerfileを書き込み、phpcli環境を定義し、cronと必要な拡張機能をインストールします。 4.タイミングタスクを定義するためにCrontabファイルを書きます。 5。Docker-Compose.ymlマウントスクリプトディレクトリを作成し、環境変数を構成します。 6.コンテナを起動し、ログを確認します。 Webコンテナでタイミングタスクを実行するのと比較して、独立したコンテナには、リソースの分離、純粋な環境、強力な安定性、容易な拡張の利点があります。ロギングとエラーキャプチャを確保するため

[ロギング方法]を選択します。初期段階では、PHPに組み込みERROR_LOG()を使用できます。プロジェクトが拡張されたら、モノログなどの成熟したライブラリに切り替え、複数のハンドラーとログレベルをサポートし、ログにタイムスタンプ、レベル、ファイルのライン番号、エラーの詳細が含まれていることを確認してください。 2。設計ストレージ構造:少量のログをファイルに保存できます。多数のログがある場合は、多数の分析がある場合はデータベースを選択します。 mysql/postgresqlを使用して構造化されたデータを使用します。 ElasticSearch Kibanaは、半構造化/非構造化に推奨されます。同時に、バックアップと定期的なクリーニング戦略のために策定されています。 3。開発および分析インターフェイス:検索、フィルタリング、集約、視覚化機能が必要です。キバナに直接統合するか、PHPフレームワークチャートライブラリを使用して、インターフェイスのシンプルさと容易さに焦点を当てて自己開発を開発することができます。

この記事の目的は、eloquentormを使用して、Laravelフレームワークで関連データの高度な条件付きクエリとフィルタリングを実行して、データベース関係に「条件付き接続」を実装する必要性を解決する方法を探ることを目的としています。この記事では、MySQLにおける外部キーの実際の役割を明確にし、閉鎖関数と組み合わせたメソッドと雄弁さを介して角質除去協会モデルに条項を適用する方法を詳細に説明します。

MySQLは金融システムに最適化する必要があります。1。財務データを使用して、10進数タイプを使用した精度を確保する必要があり、タイムゾーンの問題を回避するために時間分野でデータを使用する必要があります。 2。インデックス設計は合理的でなければなりません。フィールドの頻繁な更新を避けてインデックスを構築し、クエリの順序でインデックスを組み合わせ、定期的に役に立たないインデックスをクリーンにします。 3.トランザクションを使用して、一貫性を確保し、トランザクションの粒度を制御し、長いトランザクションを回避し、それに埋め込まれた非コア操作を回避し、ビジネスに基づいて適切な分離レベルを選択します。 4。時間ごとに履歴データを分割し、コールドデータをアーカイブし、圧縮テーブルを使用してクエリ効率を向上させ、ストレージを最適化します。

MySQLがクラウドに移動する価値があるかどうかは、特定の使用シナリオに依存します。あなたのビジネスを迅速に立ち上げる必要がある場合は、弾力的に拡張し、運用とメンテナンスを簡素化し、従量制のモデルを受け入れることができます。ただし、データベースが長期間安定している場合、レイテンシに敏感な、またはコンプライアンスの制限が制限されている場合、費用対効果が高い場合があります。コストを管理するためのキーには、適切なベンダーとパッケージの選択、リソースの合理的な構成、予約されたインスタンスの利用、バックアップログの管理、クエリパフォーマンスの最適化が含まれます。
