SQLite3にmigrationでadd_indexしても速くならない
Railsのmigrationで、add_indexというのがあります。
これをするとインデックスが作成されるので速くなるということで、こんなことをしていました。
class AddIndexToCount < ActiveRecord::Migration def self.up add_index :counts, :column1 add_index :counts, :column2 add_index :counts, :column3 end def self.down remove_index :counts, :column1 remove_index :counts, :column2 remove_index :counts, :column3 end end
CREATE INDEX "index_counts_on_column1" ON counts ("column1") CREATE INDEX "index_counts_on_column2" ON counts ("column2") CREATE INDEX "index_counts_on_column3" ON counts ("column3")
使い方くらい調べないといけないですよねぇ。これでは全く高速化されない。
TkSQLiteの機能を使ってインデックスを追加すると、以下のようなSQLが実行され、500ms->3msと100倍以上高速になりました。
CREATE INDEX 'counts_idx' ON 'counts' ('column1', 'column2', 'column3')
migrationでこのようなインデックスを作成するには、以下のようにします。
class AddIndexToCount < ActiveRecord::Migration def self.up add_index :counts, [:column1, :column2, :column3], :name=>:counts_idx end def self.down remove_index :counts, :name=>:counts_idx end end
はあ、今までのデータベース全部更新しなくては。