2011-11-05 8 views
7

MySQLの最新のソースコード(CまたはC++の場合は不明)から、どのように自動インクリメントが行われますか?つまり、最後に取り残されたテーブルにメタデータリソースのようなデータが格納されているか、テーブル内で最大のIDを見つけるためにテーブルスキャンを実行する必要があるという点で効率的ですか?また、それが実装されている方法、例えばPostgreSQLを見たときにautoincrementを使うことの否定的な側面も見えますか?MySQL、C++ - プログラムによって、MySQL自動インクリメントはどのように機能しますか?

+0

あなたはどちらのエンジンを使用していますか? (InnoDBなど) –

答えて

2

これは、データベースが使用しているエンジンによって異なります。 InnoDBは、ディスク上ではなくメモリに最大値を格納しています。非常に効率的です。私はほとんどのエンジンが同様のことをすると思いますが、それを保証することはできません。

InnoDB's Auto IncrementはDBがロードされたときに一度、以下のクエリを実行し、メモリ内の変数を格納するつもりです:

SELECT MAX(ai_col) FROM t FOR UPDATE; 

PostgreSQL年代にAUTO_INCREMENTの完全な欠如は、あなたがフィールドを実装する方法をに依存していることを比較すると、あなた自身。 (私が使ったのは最後に欠けていましたが、変更されたかもしれません)ほとんどがSEQUENCEを作成します。これは、メモリ内の疑似テーブルに格納されているように見えます。私はInnoDBをもっと簡単な方法にするつもりです。私はInnoDBが同等でない場合、InnoDBがより効率的になると思います。

+0

さて、InnoDBでは、データベースが読み込まれたときに、最後のシーケンスを探して、これを仮想メモリにテーブルのメタデータの一部としてキャッシュします。ありがとう。 – Volomike