20

He estado construyendo aplicaciones de rieles por un tiempo, pero desafortunadamente para mí, ninguna de mis aplicaciones ha tenido una gran cantidad de datos o tráfico. Pero ahora tengo uno que está ganando fuerza. Así que estoy buceando de cabeza para escalar y optimizar mi aplicación.Rails 3 Índices de base de datos y otra optimización

Parece que el primer y más fácil paso para hacer esto es con los índices de la base de datos. Tengo una gran lista de índices que deberían cubrir casi todas mis consultas, pero cuando los agregué a mi base de datos a través de migraciones, solo me llevó unos segundos agregarlos. Por alguna razón, pensé que tendrían que revisar todas mis entradas (de las cuales hay miles) e indexarlas.

¿Significa esto que mis índices no se han aplicado a mis datos ya existentes? ¿Se agregarán solo a las nuevas entradas?

Además, Estoy buscando en otras soluciones de escala, tales como memcached, y todo alrededor de adelgazar mis consultas, etc.

Si alguien me puede apuntar a algunos buenos recursos para optimizar mis carriles 3 aplicación que lo haría en gran medida ¡lo aprecio!

Gracias!

EDIT:

Gracias por todas las grandes respuestas con respecto a los índices de base de datos! ¿Qué más debería estar mirando en términos de optimizar y escalar mi aplicación? Memcached? ¿Qué tiene la mejor relación impulso/esfuerzo de rendimiento en términos de optimización?

Respuesta

22

Siempre es una buena idea agregar índices a todos sus ID y datos que 'find_by' en más de unas pocas ocasiones, p. Ej. dirección de correo electrónico. Del mismo modo, puede suponer con seguridad que la ID nunca pasará a ser negativa, por lo que crear columnas de ID sin firmar se beneficiará a largo plazo. Hable con cualquier DBA (Administrador de la base de datos) y, más de las veces, le dirá que haga esto.

Actualmente es muy probable que tenga algo como esto para todas sus Columnas de ID ...

t.integer :column_name, :null => false 

o ...

t.references :column_name, :null => false 

Simplemente cambiando esto a ...

t.column :column_name, 'integer unsigned', :null => false 

verá un pequeño aumento.

Índice de son simples ...

add_index :reviews, [:column_id, :column_type] # Polymorphic 
add_index :reviews, :column_id # Standard 

El Rails API debería darle todo lo que necesita saber.

Peepcode tiene realmente obtener tutorial video que fue una gran idea para mí y bien vale la pena los $ 12 y 37 minutos de su tiempo. Hay gemas como MetaWhere que también pueden ayudarte.

Lo más importante, en Rails 3 y superior, es ActiveRelations. Aquí es donde las consultas solo se ejecutan cuando es necesario. Por ejemplo, en lugar de User.all, puede llamar User.scoped y cuando se produce la iteración en la Vista, se ejecuta el SQL. Potente y el futuro de Rails.

Háganos saber cómo se pone ... Todo lo mejor.

8

Usted escribió:

pero cuando les añadí a mi base de datos a través de las migraciones sólo se tarda unos pocos segundos para agregarlos. Por alguna razón, pensé que tendrían que revisar todas mis entradas (de las cuales hay miles) e indexarlas.

La indexación no llevará mucho tiempo a menos que tenga millones de registros. La indexación de bases de datos es solo un tipo, y registra ese tipo para ser utilizado más adelante.

Su índice se aplica a los registros nuevos y existentes.

ACTUALIZACIÓN

más grande partido de su inversión: procesos

  1. movimiento de larga ejecución a delayed_job (o similar)
  2. Deshacerse de n + 1 consultas

Memcache es agradable, pero complica tu aplicación, y normalmente no obtienes el impulso hasta que tu aplicación se conecte a db.

+1

También revisa 'sidekiq' como una alternativa relativamente mejor (más eficiente, etc.) a' delayed_jobs' y está constantemente en desarrollo. – Ameen

+0

De acuerdo con @Ameen --- sidekiq es de lejos la mejor opción en la actualidad, con Resque un segundo. (Mi respuesta original fue en mayo de 2011, las cosas han cambiado desde entonces) –

Cuestiones relacionadas