¿Es una buena idea indexar el campo de fecha y hora en mysql?

137

Estoy trabajando en el diseño de una gran base de datos. En mi aplicación tendré muchas filas, por ejemplo, actualmente tengo una tabla con 4 millones de registros. La mayoría de mis consultas utilizan la cláusula datetime para seleccionar datos. ¿Es una buena idea indexar campos de fecha y hora en la base de datos mysql?

Select field1, field2,.....,field15
from table where field 20 between now() and now + 30 days 

Estoy tratando de mantener mi base de datos funcionando bien y las consultas se ejecutan sin problemas

Además, ¿qué idea crees que debería tener para crear una base de datos de alta eficiencia?

Jaylen
fuente
¿Qué es field 20?
AlikElzin-kilaka

Respuestas:

164

MySQL recomienda el uso de índices por varias razones, incluida la eliminación de filas entre condiciones: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Esto hace que su columna de fecha y hora sea un excelente candidato para un índice si lo va a usar en condiciones con frecuencia en consultas. Si su única condición es BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY)y no tiene otro índice en la condición, MySQL tendrá que hacer un escaneo completo de la tabla en cada consulta. No estoy seguro de cuántas filas se generan en 30 días, pero siempre que sea menos de aproximadamente 1/3 de las filas totales, será más eficiente usar un índice en la columna.

Su pregunta sobre la creación de una base de datos eficiente es muy amplia. Diría que solo asegúrese de que esté normalizado y que todas las columnas apropiadas estén indexadas (es decir, las que se usan en uniones y cláusulas where).

Píldoras de explosión
fuente
3
Gracias por la explicación. Eso realmente ayuda. Estoy seguro de que tendré más filtros. Solo quiero asegurarme de que indexar el campo de fecha y hora sea una buena idea o no, ya que podemos tener una fecha y hora duplicadas. pero su respuesta lo explicó :) Gracias
Jaylen
44
+1 para 'las que se usan en las uniones y las cláusulas where'. Una gran regla general para una estrategia de indexación. Obvio ahora que lo pienso, pero no se me había ocurrido antes
Gaz_Edge
1
Pero si consulta los datos con un rango de fechas , como el rango de datos de "2017-01-01 11:20" a "2018-01-03 12:12", no hace que la SELECTconsulta sea más rápida aunque indexé la date timecolumna. .. índice hace que la consulta sea rápida cuando uso la equaloperación. ¿Estoy en lo cierto?
user3595632
1
¿Qué tal si consulta campos de fecha y hora con funciones de hora como DÍA (fecha y hora) o HORA (fecha y hora). ¿El índice ayudará u obstaculizará en este caso?
cronoklee
hola @Explosion Pills, si solo necesito consultar la base de la tabla en año y mes, obtendré un mejor rendimiento si creé una nueva columna con solo año y mes y luego la indexo, en lugar de crear un índice de la columna de fecha y hora directamente ? Tal como que creo una columna cuyo valor es como 201801.
Woods Chen
18

Aquí el autor realizó pruebas que mostraron que la marca de tiempo de unix entero es mejor que DateTime. Tenga en cuenta que usó MySql. Pero creo que no importa qué motor de base de datos use, los enteros de comparación son un poco más rápidos que las fechas de comparación, por lo que int index es mejor que DateTime index. Tómese T1 - tiempo de comparar 2 fechas, T2 - tiempo de comparar 2 enteros. La búsqueda en el campo indexado toma aproximadamente O (log (filas)) tiempo porque el índice se basa en un árbol equilibrado; puede ser diferente para diferentes motores de base de datos, pero de todos modos el registro (filas) es una estimación común. (si no utiliza la máscara de bits o el índice basado en r-tree). Entonces, la diferencia es (T2-T1) * Registro (filas): puede desempeñar un papel si realiza su consulta con frecuencia.

Baurzhan
fuente
Gracias. Estaba pensando en eso como una opción, pero no sabía cómo abordarlo. Creo que tienes toda la razón, los enteros siempre son más rápidos.
Jaylen
62
¿Mejor? Dudo que una marca de tiempo de Unix sea mejor para todos los casos. Sí, almacenar un número entero es generalmente más rápido que almacenar una cadena, pero ¿qué pasa con todas las funciones de fecha y hora que expone MySQL? Implementarlos usted mismo tendría un efecto negativo en el rendimiento o la funcionalidad.
Greg