CREATE INDEX
を実行すると、何百万ものレコードがある巨大なテーブルでも、インデックスがすぐに作成されることに気付きました(コンソールはnsecで戻ります)。
どうしてこれなの?その時点でテーブルデータを使用してBツリーを作成しませんか? CREATE INDEX
がすぐに戻ってきたからではないと思います。
しかし、インデックスはどのように作成されますか?アクセスごとに?
Innodbでのセカンダリインデックスの作成は、MySQL 5.1 + InnoDBプラグインまたはMySQL5.5以降はるかに高速です。実際、この機能を「高速インデックス作成」と呼びます。主キーに触れない場合は、追加の構造を作成するだけで、テーブルデータを変更せずに、現在の値を読み取るだけで済みます。十分なメモリがあると仮定すると、データページがメモリ内にあり、インデックスもメモリに収まる場合、これはメモリのみの操作になるため、非常に高速になる可能性があります。ただし、プロセスが終了するとすぐにインデックスを使用できるようになります。バックグラウンドで(コンソールに制御を戻した後)、可能な場合はいつでも新しいページをディスクに書き込みます。また、その特定のテーブルスペースにあるデータの断片化の量にも依存します。これはいずれも、トランザクションログ(ディスク上にある)が原因でデータが失われる原因にはなりません。
ただし、セカンダリインデックスの一部の変更はバックグラウンドで行われると言うのは完全に正しいです。これは変更バッファーと呼ばれますが、データレコードを変更するときに使用されます。
私の経験では、InnoDBインデックスの作成は、特に非常にビジーなサーバーでは、それほど速くはありません:-)。ただし、5.6以降、セカンダリインデックスの作成は完全にオンラインになります(そのテーブルへの書き込みはブロックされません)。これは確かに非常に優れた改善です。