次の表があるとします。
create_table :my_table, :id => false do |t|
t.string :key_column
t.string :value_column
end
:key のフィールドによるバイナリ検索用に行が最適に格納されるようにするにはどうすればよいですか?
また、バイナリ検索が使用されていることを確認するにはどうすればよいですか?
次の表があるとします。
create_table :my_table, :id => false do |t|
t.string :key_column
t.string :value_column
end
:key のフィールドによるバイナリ検索用に行が最適に格納されるようにするにはどうすればよいですか?
また、バイナリ検索が使用されていることを確認するにはどうすればよいですか?
興味深い行数の場合、キーによって単一のランダムレコードにアクセスするための最適な方法(「最適」のほとんどの定義)は、インデックスを作成することです。
CREATE INDEX my_index ON my_table ( key_column );
またはActiveRecordの移行:
add_index(:my_table, :key_column)
データベースインデックスは通常、 Bツリーなどを使用したバイナリ検索を使用します。これにより、ストレージコストと、取得および更新の時間のバランスが取れます。
インデックスが使用されていることを確認することは、単一テーブル操作では比較的簡単である必要があります。
MyTable.find_by_key_column('ABC123')
たとえば、次のようなものを生成する必要があります(development.logを確認してください)。
SELECT * FROM my_table WHERE (key_column = 'ABC123')
MySQLの比較的印象的でないオプティマイザーでさえ、最適に実行するのに問題はないはずです。
行ストレージは、個々の行の取得では問題にならないはずです。とにかくそれを制御するためにできることはあまりないので、幸いです。MySQLのパフォーマンスについては、「最適」の定義に「最も信頼できる」が含まれていない場合は、ストレージエンジンとしてInnoDBではなくMyISAMを選択する必要があります。
データを正確に保存および取得するのは、データベースの仕事です。あなたが望むものを説明すると、それが実現します。それがどのように行われるかを具体的に制御したい場合、データベースは答えではありません。