儲存時間,常用的有三個選擇datetime
、timestamp
、int
。昨夜同事問到了,於是今天就總結一下自己的理解。
插入效率:datetime > timestamp > int
讀取效率:int > timestamp > datetime
儲存空間:datetime > timestamp = int
具體上面的實驗資料可以看
這篇文章。
建立索引的體積,和索引的速度,***。讓我們來看乙個應用場景:
看下這張圖,第一我們需要設定系統的預設時區,第二我們也需要提供不同時區時間顯示的需要。於是,我們分別使用datetime
、timestamp
、int
字段型別來看下:
直接顯示時間,這是個不錯的選擇,但是如果考慮到時區,很明顯計算上的麻煩。
ok,這個很好,可以根據系統的時區來自動輸出時間,但是單個使用者要定製自己的時區呢?再者你不怕麻煩,在程式裡面實現了這個計算,伺服器若是換個地方,改了下時區,你程式裡面計算單個使用者當地時間的**怎麼辦(timestamp出來的時間會根據時區的變化而變化,在某些情況下是不錯的選擇,但在某些情況下,真的很雞肋)。
從上面兩個型別的缺點看來,貌似這個型別可以解決以上的問題,其實我們只要存格林時間的unix timestamp就好了,時區時間的計算上也很方便,讀取的效率也不錯。我覺得用這個儲存的缺點呢,就是直接select的時候時間不能直觀的顯示出來。
discuz, typecho, emlog等等等等,他們都選用int了,這一定有他們的道理,我想也沒什麼可以多說的了。
今天解析dedecms時發現deder的mysql時間字段,都是用
`senddata` int(10) unsigned not null default '0';
隨後又在網上找到這篇文章,看來如果時間欄位有參與運算,用int更好,一來檢索時不用在字段上轉換運算,直接用於時間比較!二來如下所述效率也更高。
歸根結底:用int來代替data型別,更高效。
環境:
windows xp
php version 5.2.9
mysql server 5.1
第一步、建立乙個表date_test(非定長、int時間)
create table `test`.`date_test` (
`id` int not null auto_increment ,
`start_time` int not null ,
`some_content` varchar( 255 ) not null ,
primary key ( `id` )
) engine = innodb;
第二步、建立第二個表date_test2(定長、int時間)
create table `test`.`date_test2` (
`id` int not null auto_increment ,
`start_time` int not null ,
`some_content` char( 255 ) not null ,
primary key ( `id` )
) engine = innodb;
第三步、建立第三個表date_test3(varchar、datetime時間)
create table `test`.`date_test3` (
`id` int not null auto_increment ,
`start_time` datetime not null ,
`some_content` varchar( 255 ) not null ,
primary key ( `id` )
) engine = innodb;
第四步、建立第四個表date_test3(char、datetime時間)
create table `test`.`date_test4` (
`id` int not null auto_increment ,
`start_time` datetime not null ,
`some_content` char( 255 ) not null ,
primary key ( `id` )
) engine = innodb;
ok,現在我們開始做測試,環境是php,先向各個表插入一百萬條資料。插入的時候分200次,每次進庫5000條。
現在把四個表的start_time欄位一一加上索引。
因為量比較小,所以我們預設即使是微小的變化,也是有意義的。
結論:
大資料量下,如果存在大量的select * from table where 時間》xx這樣的查詢,在mysql5.1時使用int換datetime是有意義的。
選擇怎樣的路線時間最短?
如圖,直線cd.乙個質點從點a出發,到點b.已知質點在直線cd上方的速度為 v 1 在直線cd下方的速度為 v 2 而且點a離cd的距離為 a 點b離cd的距離為 b 那麼,質點選擇怎樣的路線,會使得從a到b的時間最短?首先,可以明確的是,為了使得時間最短,無論質點在直線cd的哪一方,都應該按著直線...
mysql儲存ip位址 MySQL怎樣儲存IP位址
為什麼要問如何儲存ip 首先就來闡明一下部分人得反問 為什麼要問ip得怎樣存,直接varchar型別不就得了嗎?其實做任何程式設計都要在功能實現的基礎上最大限度的優化效能。而資料庫設計是程式設計中不可忽略的乙個重要部分,所以巧存ip位址可以一定程度獲得很大提公升。利用函式演算法處理 在mysql中沒...
MySQL 時間型別的選擇
mysql 提供了 datetime 和 timestamp 兩種非常相似的型別處理日期和時間,大部分情況下兩種都是 ok 的,但是有些情況二者會互有優劣。gpdepcdg datetime 的時間跨度更大,可以從1001年到9999年,精度是秒。並且儲存的格式是將日期和時間打包使用 yyyymmd...