Tengo una pregunta sobre la base de datos Rails.
- ¿Debo agregar "índice" a todas las claves externas como "xxx_id"?
- ¿Debo agregar "índice" a la columna "id" creada automáticamente?
¿Debo agregar "index (unique)" a la columna "id" creada automáticamente?
Si agrego índice a dos claves externas a la vez (
add_index (:users, [:category, :state_id])
¿qué sucede? ¿En qué se diferencia esto de agregar el índice para cada clave?class CreateUsers < ActiveRecord::Migration def self.up create_table :users do |t| t.string :name t.integer :category_id t.integer :state_id t.string :email t.boolean :activated t.timestamps end # Do I need this? Is it meaningless to add the index to the primary key? # If so, do I need :unique => true ? add_index :users, :id # I don't think I need ":unique => true here", right? add_index :users, :category_id # Should I need this? add_index :users, :state_id # Should I need this? # Are the above the same as the following? add_index (:users, [:category, :state_id]) end end
Gran respuesta hasta ahora. Pregunta adicional
- Debo agregar "index with unique" para xxx_id, ¿verdad?
La indexación puede ser algo sutil y complicado, pero hay reglas generales que se aplican que pueden hacer que determinar cuál usar sea mucho más fácil.
Lo primero que debe recordar es que los índices pueden funcionar en más de una forma. Un índice en A, B, C también funciona para A, B y simplemente A, por lo que puede diseñar sus índices para que sean más versátiles si los ordena correctamente. La guía telefónica está indexada en Apellido, Nombre, por lo que puede buscar personas fácilmente por su apellido o una combinación de apellido y nombre. Sin embargo, no puede buscarlos directamente por su nombre de pila. Necesitarías un índice separado para eso. Lo mismo ocurre con el número de teléfono, que también debería indexar.
Con eso en mente, hay muchas cosas que dictarán cómo crear índices:
belongs_to
-has_many
registrar su teléfono móvil, es necesario tener un índice en la clave externa utilizada.has_many :through
relación, su tabla de unión debe tener un índice único en ambas propiedades involucradas en la unión como una clave compuesta.has_many
relación utilizando un ámbito, asegúrese de que haya un índice que incluya lahas_many
clave externa y la columna de ámbito en ese orden.El objetivo con los índices es eliminar las temidas operaciones de "escaneo de tablas" u "clasificación de archivos" que se producen cuando sus datos no se indexan correctamente.
En términos simples, observe las consultas que genera su aplicación y asegúrese de que las columnas a las que se hace referencia
WHERE
o lasHAVING
condiciones yORDER BY
cláusulas estén representadas en ese orden.fuente
index: true
a su definición de columna para casos simples, pero a veces es posible que desee tener más control sobre ella. Tener índices por defecto en las claves externas no es un terrible defecto, pero puede sorprender a las personas.add_index :users, :email, unique: true
)order by [a, b]
ofind where( a and b )
, entonces necesita un índice doble:Ejemplo concreto:
Si usted tiene:
Deberías agregar:
Nota: Un índice ocupa espacio adicional en el disco y hace que sea más lento crear y actualizar cada registro, ya que tiene que reconstruir cada índice.
Crédito:
https://tomafro.net/2009/08/using-indexes-in-rails-choosing-additional-indexes , rails - created_at cuando el usuario solicita, ¿debe agregar un índice a la tabla? , y las respuestas anteriores.
fuente