ejemplo - Índice MySQL Integer frente a DateTime
mysql time() (3)
Permítanme comenzar diciendo que he consultado muchas preguntas similares, pero todas se relacionan con el tipo de campo Timestamp
y DateTime
sin indexación. Al menos eso es lo que yo entiendo.
Como todos sabemos, hay ciertas ventajas cuando se trata de DateTime. Dejándolos a un lado por un minuto, y asumiendo que el motor de la tabla es InnoDB
con más de 10+ million records
, qué consulta funcionaría más rápido cuando los criterios se basen en:
- DateTime con índice
- int con índice
En otras palabras, ¿es mejor almacenar la fecha y la hora como DateTime
o UNIX timestamp en int
? Tenga en cuenta que no es necesario utilizar ninguna función MySQL incorporada.
Actualizar
Probado con MySQL 5.1.41 (64 bits) y 10 millones de registros, las pruebas iniciales mostraron una diferencia de velocidad significativa a favor de int
. Se usaron dos tablas, tbl_dt
con DateTime
y tbl_int
con int
column. Pocos resultados:
SELECT SQL_NO_CACHE COUNT(*) FROM `tbl_dt`;
+----------+
| COUNT(*) |
+----------+
| 10000000 |
+----------+
1 row in set (2 min 10.27 sec)
SELECT SQL_NO_CACHE COUNT(*) FROM `tbl_int`;
+----------+
| count(*) |
+----------+
| 10000000 |
+----------+
1 row in set (25.02 sec)
SELECT SQL_NO_CACHE COUNT(*) FROM `tbl_dt` WHERE `created` BETWEEN ''2009-01-30'' AND ''2009-12-30'';
+----------+
| COUNT(*) |
+----------+
| 835663 |
+----------+
1 row in set (8.41 sec)
SELECT SQL_NO_CACHE COUNT(*) FROM `tbl_int` WHERE `created` BETWEEN 1233270000 AND 1262127600;
+----------+
| COUNT(*) |
+----------+
| 835663 |
+----------+
1 row in set (1.56 sec)
Publicaré otra actualización con ambos campos en una tabla como lo sugiere shantanuo .
Actualización # 2
Resultados finales después de numerosos bloqueos del servidor :) El tipo de Int es significativamente más rápido, sin importar qué consulta se ejecutó, la diferencia de velocidad fue más o menos la misma que la de los resultados anteriores.
Lo "extraño" observado fue que el tiempo de ejecución era más o menos el mismo cuando dos tipos de campo están almacenados en la misma tabla. Parece que MySQL es lo suficientemente inteligente como para saber cuándo los valores son los mismos cuando se almacenan tanto en DateTime como en int. No he encontrado ninguna documentación sobre el tema, por lo tanto, es solo una observación.
Mi instinto sería decir que los Ints son siempre más rápidos. Sin embargo, este parece no ser el caso
Editado para agregar: me doy cuenta de que estás usando InnoDB, en lugar de MyISAM, pero no he encontrado nada que contradiga esto en el caso InnoDB. Además, el mismo autor hizo una prueba InnoDB
Veo que en la http://gpshumano.blogs.dri.pt/2009/07/06/mysql-datetime-vs-timestamp-vs-int-performance-and-benchmarking-with-myisam/ , el autor básicamente prueba que cuando la UNIX time
se calcula por adelantado, INT
gana.
depende de su aplicación, como puede ver en una impresionante comparación y punto de referencia de tipo DATETIME, TIMESTAMP e INT en el servidor Mysql en formato de fecha MySQL: ¿Qué tipo de datos debe usar? Comparamos Datetime, Timestamp e INT. se puede ver en alguna situación que INT tiene mejor porfomancia que otras y, en algunos casos, DATETIME tiene un mejor rendimiento. y depende completamente de tu aplicación