02 Sep Adding indexes to Postgresql in Rails + concurrently indexes
In this post, I’m going to write down how to add indexes to your tables in Rails if you are using Postgresql.
Primary keys
You don’t need to create these indexes manually PostgreSQL automatically creates an index for primary keys to enforce uniqueness
If you want to add an index to an existent table you can create a new migration and include you indexes something as follow:
rails g migration AddIndexPatientsQuestions
In the file generated you can include something like:
class AddIndexPatientsQuestions < ActiveRecord::Migration def up add_index :patients, :user_id add_index :questions, :user_id add_index :patients, :custom_fields, algorithm: :concurrently end def down remove_index :patients, :user_id remove_index :questions, :user_id remove_index :patients, :custom_fields end end
If you notice in the previous migration I’m using the algorithm: :concurrently which allows you to create your indexes concurrently so that your table isn’t locked as the index builds(it is included in the latest Rails 4.XX version).
If you want to create a new table and include and index in the same migration you can do it like so:
class CreateQuestions < ActiveRecord::Migration def change create_table :questions do |t| t.string :section_name t.boolean :required, default: false # I'm using postgres_ext t.text :custom_fields, array: true t.timestamps null: false end end add_index :patients, :custom_fields, algorithm: :concurrently end
Now let’s take a quick look a different kind of indexes:
Partial indexes
add_index :questions, :required, where: "required = false"
Sorted indexes
add_index :questions, :created_at, order: { created_at: "DESC NULLS LAST" }
Unique indexes
add_index :users, :email, unique: true
Foreign keys
add_index :questions, :user_id
No Comments