2011-01-04 21 views
35

Vorrei iniziare dicendo che ho esaminato molte domande simili, ma tutte si riferiscono al tipo di campo Timestamp e DateTime senza indicizzazione. Almeno questa è la mia comprensione.Indice MySQL integer vs DateTime

Come tutti sappiamo, ci sono alcuni vantaggi quando si tratta di DateTime. li Mettendo da parte per un minuto, e assumendo il motore del tavolo è InnoDB con 10+ million records, che interrogazione avrebbe eseguito più velocemente quando criteri si basa su:

  1. DateTime con indice
  2. int con indice

In altre parole, è meglio memorizzare data e ora come DateTime o timestamp UNIX in int? Tenere presente che non è necessario utilizzare funzioni MySQL incorporate.

Aggiornamento

Testato con MySQL 5.1.41 (64 bit) e 10 milioni di dischi, i test iniziali hanno mostrato una significativa differenza di velocità a favore di int. Sono stati utilizzati due tavoli, tbl_dt con DateTime e tbl_int con colonna int. Pochi i risultati:

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) 

Vi posto un altro aggiornamento con entrambi i campi in una tabella come suggerito da shantanuo.

Aggiornamento # 2

risultati finali dopo numerosi crash del server :) tipo int è significativamente più veloce, non importa quale query è stata eseguita, la differenza di velocità era più o meno lo stesso di risultati di cui sopra.

"Strange" cosa osservata era il tempo di esecuzione era più o meno lo stesso quando due tipi di campi sono memorizzati nella stessa tabella. Sembra che MySQL sia abbastanza intelligente da capire quando i valori sono gli stessi quando sono archiviati in DateTime e int. Non ho trovato alcuna documentazione sull'argomento, quindi è solo un'osservazione.

+0

Hai provato? Perché non impostare un benchmark rapido e scoprirlo? – ircmaxell

+0

Lavorando su di esso mentre parliamo, ci vuole del tempo per popolare 10 milioni di record con il mio hardware :) –

+0

Assicurati di selezionare SQL_NO_CACHE nei tuoi test – coolgeek

risposta

5

Il mio istinto sarebbe dire che gli int sono sempre più veloci. Tuttavia, questo non sembra essere il caso

http://gpshumano.blogs.dri.pt/2009/07/06/mysql-datetime-vs-timestamp-vs-int-performance-and-benchmarking-with-myisam/

A cura di aggiungere: Mi rendo conto che si sta utilizzando InnoDB, invece di MyISAM, ma non ho trovato nulla per contraddire questa nel caso InnoDB. Inoltre, lo stesso autore ha fatto un test di InnoDB

http://gpshumano.blogs.dri.pt/2009/07/06/mysql-datetime-vs-timestamp-vs-int-performance-and-benchmarking-with-innodb/

+6

Solo perché usa 'WHERE datetime> UNIX_TIMESTAMP ('1970-01-01 01:30:00') AND datetime