Ver How MySQL Uses Indexes.
También valide si MySQL todavía realiza un full table scan después de agregar filas adicionales de 2000 o así a su tabla user_metrics
. En las tablas pequeñas, el acceso por índice es en realidad más caro (I/O-wise) que un escaneo de tabla, y el optimizador de MySQL podría tener esto en cuenta.
Contrariamente a mi anterior post, resulta que MySQL es también using a cost-based optimizer, que es una muy buena noticia - es decir, siempre y cuando ejecuta su ANALYZE
al menos una vez cuando se cree que el volumen de datos en su base de datos es representante del uso diario futuro.
Cuando se trata de optimizadores basados en costos (Oracle, Postgres, etc.), debe asegurarse de ejecutar periódicamente ANALYZE
en sus diversas tablas, ya que su tamaño aumenta en más del 10-15%. (Postgres lo hará automáticamente por usted, de forma predeterminada, mientras que otros RDBMS dejarán esta responsabilidad a un DBA, es decir, usted). A través del análisis estadístico, ANALYZE
ayudará al optimizador a tener una mejor idea de la cantidad de E/S (y otras recursos, tales como CPU, necesarios, por ejemplo, para la clasificación) estarán involucrados al elegir entre varios planes de ejecución candidatos. Si no se ejecuta ANALYZE
puede dar lugar, las decisiones de planificación a veces desastrosas muy pobres (por ejemplo milisegundos-consultas tomar, a veces, horas debido a malas bucles anidados en JOIN
s.)
Si el rendimiento sigue siendo insatisfactoria después de ejecutar ANALYZE
, a continuación, por lo general, podrá evitar el problema mediante el uso de sugerencias, por ejemplo, FORCE INDEX
, mientras que en otros casos es posible que haya tropezado con un error de MySQL (por ejemplo, este older one, que podría haber mordido usted fue para utilizar Rails 'nested_set
).
Ahora, ya que estás en una aplicación Rails, va a ser complicado (y derrotar el propósito de ActiveRecord
) para emitir sus consultas personalizadas con toques en vez de continuar el uso de los ActiveRecord
los -generated.
había mencionado que en la solicitud de nuestros rieles todosSELECT
consultas cayeron por debajo de 100 ms después de cambiar a Postgres, mientras que algunos de los complejos combinaciones que genera por ActiveRecord
que de vez en cuando tomar tanto como 15 años o más con MySQL 5.1 a causa de bucles anidados con escaneos internos de la tabla, incluso cuando los índices estaban disponibles. Ningún optimizador es perfecto, y debe conocer las opciones. Otros posibles problemas de rendimiento a tener en cuenta, además de la optimización del plan de consulta, son el bloqueo. Sin embargo, esto está fuera del alcance de su problema.
¿Qué significan tus N? ¿Son constantes literales, columnas o variables? Eso es importante. – Quassnoi
Lo siento, esos fueron pegados desde la salida de mi complemento query_reviewer. Las consultas reales tienen enteros allí, es decir. IN (25, 26, 27) – jasonlong
@blackant: ¿has analizado en tus mesas? – vladr