Pregunta

Me gustaría acelerar una consulta de MySQL que básicamente recupera una página de datos siguiendo el patrón a continuación

select
 my_field_A,
 my_field_B
where
 time_id >= UNIX_TIMESTAMP('1901-01-01  00:00:00') AND
 time_id < UNIX_TIMESTAMP('2009-01-16  00:00:00')

El campo time_id es un índice de MySQL, sin embargo, la consulta se comporta como si toda la base de datos se leyera en cada consulta (la recuperación de un par de líneas es bastante lenta). Yo no soy un experto en MySQL. ¿Alguien puede adivinar lo que estoy haciendo mal?

¿Fue útil?

Solución

Asegúrese de tener un índice (árbol B) en time_id, esto debería ser eficiente para las consultas de rango. También asegúrese de que time_id esté en el formato de hora adecuado.

Si realmente desea comprender qué está haciendo mysql, puede agregar la palabra clave "explicar" delante de la consulta y ejecutarla en su cliente mysql. Esto mostrará información sobre lo que está haciendo mysql y qué tipo de análisis se realizan.

http://dev.mysql.com/doc /refman/5.0/en/using-explain.html

Otros consejos

Como es probable que muchos de los time_id caigan bajo estos criterios, MySQL puede pensar que el escaneo completo de la tabla es mejor.

Intente forzar el índice:

SELECT
 my_field_A,
 my_field_B
FROM mytable FORCE INDEX (index_name_on_time_id)
WHERE
 time_id >= UNIX_TIMESTAMP('1901-01-01  00:00:00') AND
 time_id < UNIX_TIMESTAMP('2009-01-16  00:00:00')

¿Necesita el rango inferior? ¿Hay alguna entrada anterior a 1901? ¿Cómo se genera la columna time_id? Si el time_id siempre es mayor con cada nueva entrada que se agrega a la base de datos, es posible que desee considerar encontrar la ID con la entrada más cercana al 2009-01-16 y luego seleccionar por ID

select my_field_A, my_field_B
FROM
  mytable
WHERE
  id <= ?

Si ese no es el caso, intente verificar la partición disponible en MySQL 5.1 y divida la tabla por años, eso debería aumentar la velocidad dramáticamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top