Mysql儲存時間選擇怎樣的字段型別

2021-06-21 10:28:47 字數 2527 閱讀 4895

儲存時間,常用的有三個選擇datetimetimestampint。昨夜同事問到了,於是今天就總結一下自己的理解。

插入效率:datetime > timestamp > int

讀取效率:int > timestamp > datetime

儲存空間:datetime > timestamp = int

具體上面的實驗資料可以看

這篇文章。

建立索引的體積,和索引的速度,***。讓我們來看乙個應用場景:

看下這張圖,第一我們需要設定系統的預設時區,第二我們也需要提供不同時區時間顯示的需要。於是,我們分別使用datetimetimestampint字段型別來看下:

直接顯示時間,這是個不錯的選擇,但是如果考慮到時區,很明顯計算上的麻煩。

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...