なんで?
私にとって最初の主な目標は純粋に理論的な関心でした。MySQLにリンクするほとんどのスクリプトをサポートせずに動作させるために、MySQL関数をPHPで置き換えることが常に望まれていました。
SQLパーサーを作成する前に、このDBMSをサポートするプラットフォームを作成する必要があります。 最初はこれらの目的でphpTableを使用しましたが、インデックスをサポートしていないため、大量の情報を処理することは不可能でした。 また、インデックスをサポートする他のDBMSが見つからなかったため、データベースのカーネルを自分で作成する必要がありました。 私はかなり長い間開発を続けてきました。たとえば、 Bツリーのサポートを追加したり、それらに基づいてインデックスを整理したりといった、いくつかの進化的なステップを経ました。
開発を手伝ってくれる人を探しているので、今の形でここに投稿します。 たとえば、私のDBMSにはSQLサポートがありません。そのようなサポートを追加したいのですが、私自身はデータベースコアのさらなる開発に携わりたいです。
どんな感じ
この段階では、データベースのコアは開発の初期段階にあり、デバッグコードの一部は、ここで紹介するバージョンから削除されていません。 もちろん、それらは今すぐ削除してDBMSで使用できますが、これに注意を集中したくありません。 「戦闘中」のカーネルを見るのが待ちきれない場合は、デモをご覧ください。
仮のフォーラムにインポートされたフォーラムデータベースforum.dklab.ru
当初、フォーラムではMySQLを使用していましたが、DBMSのカーネルで動作するように変更されました(このプロセスには数時間しかかかりませんでした)。 forum.dklab.ruデータベースには約150,000のメッセージが含まれ、メッセージデータベースには約60 MBが必要です(ソースは誰にでも送信できます)。
現在のデータベース機能
現時点では、ベースはAUTO_INCREMENTフィールドをサポートしています。これは、PRIMARY INDEXと、MySQLのINDEXおよびUNIQUEインデックスの類似物です。 複数のインデックス付きフィールドがサポートされています。 現在、複合インデックスのサポートはなく、これまでのところ計画はありません。 また、数値フィールド(INT)のみがインデックスに使用できます。
現在、文字列の取得に使用されるメソッドの構文では、「 field_name operator value 」という形式の条件を1つだけ取得できます。ここで、演算子は「> <= IN」のいずれかです。 インデックスは、「 field_name = value」という形式のクエリにのみ使用されます。 PRIMARY INDEXには、IN演算子を使用したサンプリングの最適化もあります(これはMySQLの完全な類似物です)。
これらの機能は非常に小さいように見えるかもしれませんが、これは、たとえば、カーネルに基づいたフォーラムやCMSを作成するのに十分です。
技術的な詳細
PRIMARY INDEX ( AUTO_INCREMENT ) , , : id*4 (4 = sizeof(int)) . .
UNIQUE -. , - ( ~log(- ) / log(70) ), — .
INDEX -, . , INDEX .
32-, 2 , . , «» — unix
cat *.idx *.btr *.pri > /dev/null
, . , .
, .
$db = new YNDb('my_data');
— . , — , .
$db->create('test_table', array('id' => 'INT', 'name' => 'TINYTEXT'), array('AUTO_INCREMENT' => 'id') );
:
for($i = 0; $i < 100; $i++)
{
$db->insert('test_table', array('name' => 'value'.$i));
}
, , limit', .. :
$results = $db->select('test_table', array('cond' => 'id > 30', 'limit' => '30,50', 'order' => array('name', SORT_ASC) ) );
* This source code was highlighted with Source Code Highlighter.
?
Google Code:
code.google.com/p/yndb
, , , «YNDbAdmin» — 300 , .
:)!