ホームページ データベース mysql チュートリアル データベースの最も単純な実装

データベースの最も単純な実装

Nov 24, 2016 am 11:04 AM
mysql データベース

すべてのアプリケーション ソフトウェアの中で、データベースが最も複雑かもしれません。

MySQLのマニュアルは3,000ページ以上、PostgreSQLのマニュアルは2,000ページ以上、Oracleのマニュアルは両方を合わせたよりも厚いです。

データベースの最も単純な実装

しかし、最も単純なデータベースを自分で書くことは難しくありません。 Reddit には、原理をわずか数百語で明確に説明した投稿があります。以下はこの投稿をもとに私がまとめたものです。

1.データをテキスト形式で保存します

最初のステップは、保存したいデータをテキストファイルに書き込むことです。このテキスト ファイルがデータベースになります。

読みやすくするために、データをレコードに分割し、各レコードの長さが等しくなるように指定する必要があります。たとえば、各レコードの長さが 800 バイトであると仮定すると、5 番目のレコードの開始位置は 3200 バイトになります。

ほとんどの場合、私たちは特定のレコードの位置を知りません。知っているのは主キーの値だけです。このとき、データを読み取るために、レコードを 1 つずつ比較することができます。ただし、実際のアプリケーションでは、データベースはデータの保存に B ツリー形式を使用することがよくあります。

2. B ツリーとは何ですか?

B ツリーを理解するには、二分探索木から始める必要があります。

データベースの最も単純な実装

二分探索木は非常に探索効率の高いデータ構造であり、3つの特徴があります。

(1) 各ノードには最大 2 つのサブツリーがあります。

(2) 左側のサブツリーは親ノードより小さい値を持ち、右側のサブツリーは親ノードより大きい値を持ちます。

(3) n 個のノード間でターゲット値を見つけるには、通常、log(n) の比較のみが必要です。

二分探索木の構造は、探索効率がレベル数に関係するため、データベースには適していません。データが低いほど、より多くの比較が必要になります。極端な場合、ターゲット値を見つけるには、n 個のデータで n 回の比較が必要になります。データベースの場合、レイヤーに入るたびにハードディスクからデータを読み取る必要があります。これは、データベースがデータを読み取る回数が少ないほど、ハードディスクの読み取り時間がはるかに長いためです。ハードディスクであればあるほど良いです。

Bツリーは二分探索木を改良したものです。その設計上の考え方は、複数のデータを一度に読み取ることができ、ハードディスクの操作数を減らすことができるように、関連するデータをできるだけまとめることです。

データベースの最も単純な実装

B-treeにも3つの特徴があります。

(1) ノードは複数の値を保持できます。たとえば、上の図では、最大のノードは 4 つの値を保持します。

(2) データが既に入力されていない限り、新しいレイヤーは追加されません。言い換えれば、B-tree は可能な限り少ない「層」を追求します。

(3) 子ノードの値は、親ノードの値と厳密にサイズが一致します。一般に、親ノードに値がある場合、a+1 個の子ノードが存在します。たとえば、上の図では、親ノードには 2 つの値 (7 と 16) があり、これらは 3 つの子ノードに対応しており、最初の子ノードの値は 7 より小さく、最後の子ノードの値は 16 より大きくなります。 、中央の子ノード 7 ~ 16 の値です。

このデータ構造は、ハードディスクからの読み取り回数を減らすのに非常に役立ちます。ノードが 100 個の値を保持できると仮定すると、3 層の B ツリーは 100 万個のデータを保持できます。これを二分探索ツリーに置き換えると、20 個の層が必要になります。オペレーティング システムが一度に 1 つのノードを読み取り、ルート ノードがメモリ内に残ると仮定すると、B ツリーは 100 万個のデータの中からターゲット値を見つけるためにハードディスクを 2 回読み取るだけで済みます。

3. インデックス

データベースは B ツリー形式で保存されており、「主キー」に従ってデータを検索する問題のみを解決します。他のフィールドを検索したい場合は、インデックスを作成する必要があります。

いわゆるインデックスとは、あるフィールドをキーとしたBツリーファイルのことです。従業員番号 (主キー) と名前の 2 つのフィールドを含む「従業員テーブル」があるとします。名前のインデックス ファイルを作成して、名前を B ツリー形式で保存できます。各名前の後にデータベース内の位置 (つまり、どのレコードが指定されるか) が続きます。名前を検索する場合は、まずインデックスから対応するレコードを見つけてから、テーブルからそれを読み取ります。

このインデックス検索方式を「Indexed Sequential Access Method」、略してISAMといいます。すでに複数の実装 (C-ISAM ライブラリや D-ISAM ライブラリなど) が用意されており、これらのコード ライブラリを使用する限り、最も単純なデータベースを自分で作成できます。

4. 高度な機能

最も基本的なデータ アクセス (インデックス作成を含む) を展開した後、いくつかの高度な機能も実装できます。

(1) SQL 言語はデータベースの汎用操作言語であるため、SQL コマンドを対応する ISAM 操作に解析するには SQL パーサーが必要です。

(2)データベース接続(join)とは、データベース内の2つのテーブル間に「外部キー」を介して接続関係を確立することを指します。この操作を最適化する必要があります。

(3) データベーストランザクション (トランザクション) は、バッチでの一連のデータベース操作を指します。1 つのステップが失敗すると、操作全体が失敗します。そのため、操作が失敗した場合にロールバックできるように「操作ログ」を保持する必要があります。

(4) バックアップの仕組み: データベースのコピーを保存します。

(5) リモート操作: TCP/IP プロトコルを介して、ユーザーが異なるマシン上でデータベースを操作できるようにします。


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

PHP で MySQL クエリのパフォーマンスを最適化するにはどうすればよいですか? PHP で MySQL クエリのパフォーマンスを最適化するにはどうすればよいですか? Jun 03, 2024 pm 08:11 PM

MySQL クエリのパフォーマンスは、検索時間を線形の複雑さから対数の複雑さまで短縮するインデックスを構築することで最適化できます。 PreparedStatement を使用して SQL インジェクションを防止し、クエリのパフォーマンスを向上させます。クエリ結果を制限し、サーバーによって処理されるデータ量を削減します。適切な結合タイプの使用、インデックスの作成、サブクエリの使用の検討など、結合クエリを最適化します。クエリを分析してボトルネックを特定し、キャッシュを使用してデータベースの負荷を軽減し、オーバーヘッドを最小限に抑えます。

PHP で MySQL のバックアップと復元を使用するにはどうすればよいですか? PHP で MySQL のバックアップと復元を使用するにはどうすればよいですか? Jun 03, 2024 pm 12:19 PM

PHP で MySQL データベースをバックアップおよび復元するには、次の手順を実行します。 データベースをバックアップします。 mysqldump コマンドを使用して、データベースを SQL ファイルにダンプします。データベースの復元: mysql コマンドを使用して、SQL ファイルからデータベースを復元します。

PHP を使用して MySQL テーブルにデータを挿入するにはどうすればよいですか? PHP を使用して MySQL テーブルにデータを挿入するにはどうすればよいですか? Jun 02, 2024 pm 02:26 PM

MySQLテーブルにデータを挿入するにはどうすればよいですか?データベースに接続する: mysqli を使用してデータベースへの接続を確立します。 SQL クエリを準備します。挿入する列と値を指定する INSERT ステートメントを作成します。クエリの実行: query() メソッドを使用して挿入クエリを実行します。成功すると、確認メッセージが出力されます。

PHP で MySQL ストアド プロシージャを使用するにはどうすればよいですか? PHP で MySQL ストアド プロシージャを使用するにはどうすればよいですか? Jun 02, 2024 pm 02:13 PM

PHP で MySQL ストアド プロシージャを使用するには: PDO または MySQLi 拡張機能を使用して、MySQL データベースに接続します。ストアド プロシージャを呼び出すステートメントを準備します。ストアド プロシージャを実行します。結果セットを処理します (ストアド プロシージャが結果を返す場合)。データベース接続を閉じます。

MySQL 8.4 で mysql_native_password がロードされていないエラーを修正する方法 MySQL 8.4 で mysql_native_password がロードされていないエラーを修正する方法 Dec 09, 2024 am 11:42 AM

MySQL 8.4 (2024 年時点の最新の LTS リリース) で導入された主な変更の 1 つは、「MySQL Native Password」プラグインがデフォルトで有効ではなくなったことです。さらに、MySQL 9.0 ではこのプラグインが完全に削除されています。 この変更は PHP および他のアプリに影響します

PHP を使用して MySQL テーブルを作成するにはどうすればよいですか? PHP を使用して MySQL テーブルを作成するにはどうすればよいですか? Jun 04, 2024 pm 01:57 PM

PHP を使用して MySQL テーブルを作成するには、次の手順が必要です。 データベースに接続します。データベースが存在しない場合は作成します。データベースを選択します。テーブルを作成します。クエリを実行します。接続を閉じます。

PHP で MySQLi を使用してデータベース接続を確立するための詳細なチュートリアル PHP で MySQLi を使用してデータベース接続を確立するための詳細なチュートリアル Jun 04, 2024 pm 01:42 PM

MySQLi を使用して PHP でデータベース接続を確立する方法: MySQLi 拡張機能を含める (require_once) 接続関数を作成する (functionconnect_to_db) 接続関数を呼び出す ($conn=connect_to_db()) クエリを実行する ($result=$conn->query()) 閉じる接続 ( $conn->close())

iOS 18では、紛失または破損した写真を復元するための新しい「復元」アルバム機能が追加されます iOS 18では、紛失または破損した写真を復元するための新しい「復元」アルバム機能が追加されます Jul 18, 2024 am 05:48 AM

Apple の最新リリースの iOS18、iPadOS18、および macOS Sequoia システムでは、さまざまな理由で紛失または破損した写真やビデオをユーザーが簡単に回復できるように設計された重要な機能が写真アプリケーションに追加されました。この新機能では、写真アプリのツール セクションに「Recovered」というアルバムが導入され、ユーザーがデバイス上に写真ライブラリに含まれていない写真やビデオがある場合に自動的に表示されます。 「Recovered」アルバムの登場により、データベースの破損、カメラ アプリケーションが写真ライブラリに正しく保存されない、または写真ライブラリを管理するサードパーティ アプリケーションによって失われた写真やビデオに対する解決策が提供されます。ユーザーはいくつかの簡単な手順を実行するだけで済みます

See all articles