Pregunta

Tengo una pregunta acerca de esta consulta:

SELECT * 
  FROM runs 
 WHERE (NOW() BETWEEN began_at 
                  AND finished_at)

¿Crees que tiene sentido para crear índice compuesto de began_at y columnas finished_at? O que tiene sentido para crear índice sólo para began_at?

¿Fue útil?

Solución

Su estilo es muy poco común.

La mayoría de la gente probablemente escribiría WHERE began_at < NOW() AND finished_at > NOW()

Sin embargo. Yo recomendaría poner un índice en ambos campos.

Una llave combinada No será de utilidad para usted, ya que sólo se aceleraría buscador de combinaciones fecha específica.

Bueno, esto no es del todo cierto ya que si se utiliza una llave combinada betree le ayudará, pero no tan bueno como si ponerlos en un índice por separado. llaves combinadas son muy buenos si se busca combinaciones de campos con la igualdad operador (=). índices de campos individuales se desempeñan mejor en las solicitudes Ragen.

Puede google un poco de "búsqueda multidimensional gama".

La razón es que todos los campos coincidentes en un campo se pueden encontrar básicamente en el tiempo log (n) en btree. Por lo que su tiempo de ejecución global será O (k * log (n)), que es O (log (n)).

consultas

Multidimensional gama tienen un tiempo de ejecución de O (sqrt (n)) que es superior. Sin embargo hay mejores implementaciones, así que también acheav tiempo de ejecución logarítmica. Sin embargo, no se apliquen plenamente en MySQL, por lo que será peor o terrible dependiendo de la versión.

Así que vamos a resumir:

  • comparaciones de igualdad en los campos individuales: índice hash (tiempo de ejecución O (1))

  • rango de búsqueda en los campos individuales: Índice btree en campos individuales (O (log (n)))

  • La igualdad de búsqueda en múltiples campos: combinada clave hash (tiempo de ejecución O (1))

esos casos son una cosa clara ...

  • rango de búsqueda en múltiples campos: btree índices separados (O (log (n)))

Este es el lugar donde no es tan claro. con las versiones actuales su claramente mejor al índice por separado debido a las razones dadas anteriormente. Con una aplicación perfecta para que los casos de uso que podría lograr un mejor rendimiento con llaves combinadas, pero no hay un sistema de conocimientos de que la soporta. soporta MySQL pierden índices (que necesita para eso) desde la versión 5.0, pero sólo muy limitado y el optimizador de consultas sólo les utiliza en casos raros que yo sepa. no se sabe acerca de las versiones más recientes, como 5.3 o algo así.

Sin embargo, con la implementación de MySQL los índices sueltos llaves combinadas en los campos donde se hacen peticiones de rango o clasificación en diferentes direcciones cada vez más relevante.

Otros consejos

Debido a la utilización de desigualdades y no igualdades , un índice compuesto no va a hacer ningún mucho mejor (o peor) que los dos índices individuales.

me gustaría abogar por inclinarse hacia dos índices individuales en tanto began_at y finished_at.

Referencias para la exploración de índice suelta:

http: //www.mysqlperformanceblog .com / 2006/05/09 / descendente indexación-y-suelta-index-scan /

http://dev.mysql.com/ doc / RefMan / 5.5 / es / sueltas índice de scan.html

La estrategia de "Índice de combinación" podría entrar en juego a partir de MySQL 5 en adelante: http://dev.mysql.com/doc/refman/5.0/en/index-merge-optimization.html -. que también sugiere que los índices separados podría ser mejor

Sin embargo, nunca he sido capaz de conseguir que funcione para mí:)

La respuesta correcta a este tipo de pregunta siempre es: "depende". Probarlo en ambos sentidos y de referencia y los planes de ejecución de comparar. Tenga en cuenta que la respuesta también cambia a medida que la cantidad de datos de las tablas cambios y los cambios en la carga de trabajo de consultas. Índices en un sistema en evolución casi nunca son el fuego y se olvidan.

Buena pregunta, pero en realidad empezaría con índices en ambos began_at y finished_at, porque de una manera razonable, es posible que vuelva a escribir esta consulta es como tan

SELECT *
  FROM runs
 WHERE began_at < NOW()
   AND finished_at > NOW()

Lo que hace que sea un poco más claro (para mí) que cada columna necesita su propio índice.

nunca he conseguido MySQL para utilizar el uso de dos índices individuales para begin_at o finished_at al intentar optimizar este tipo de consulta. Al parecer, otras personas están diciendo que un índice compuesto no funciona bien, por lo que puede no ser posible obtener MySQL para optimizar esta consulta mediante un índice.

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