我們平時開發中經常需要記錄時間,比如用於記錄某條記錄的創建時間以及修改時間。在資料庫中儲存時間的方式有很多種,比如 MySQL 本身就提供了日期類型,比如 DATETIME,TIMESTAMEP
2021-07-03 03:04:39
我們平時開發中經常需要記錄時間,比如用於記錄某條記錄的創建時間以及修改時間。在資料庫中儲存時間的方式有很多種,比如 MySQL 本身就提供了日期類型,比如 DATETIME,TIMESTAMEP 等,我們也可以直接儲存時間戳為 INT 類型,也有人直接將時間儲存為字元串類型。
那麼到底哪種儲存時間的方式更好呢?請看本文內容。
不要使用字元串儲存時間類型
這是初學者很容易犯的錯誤,容易直接將欄位設定為 VARCHAR 類型,儲存"2021-01-01 00:00:00"這樣的字元串。當然這樣做的優點是比較簡單,上手快。
但是極力不推薦這樣做,因為這樣做有兩個比較大的問題:
字元串佔用的空間大這樣儲存的欄位比較效率太低,只能逐個字元比較,無法使用 MySQL 提供的日期APIMySQL 中的日期類型
MySQL 資料庫中常見的日期類型有 YEAR、DATE、TIME、DATETIME、TIMESTAMEP。因為一般都需要將日期精確到秒,其中比較合適的有DATETIME,TIMESTAMEP。
DATETIME
DATETIME 在資料庫中儲存的形式為:YYYY-MM-DD HH:MM:SS,固定佔用 8 個位元組。
從 MySQL 5.6 版本開始,DATETIME 類型支援毫秒,DATETIME(N) 中的 N 表示毫秒的精度。例如,DATETIME(6) 表示可以儲存 6 位的毫秒值。
TIMESTAMEP
TIMESTAMP 實際儲存的內容為‘1970-01-01 00:00:00’到現在的毫秒數。在 MySQL 中,由於類型 TIMESTAMP 佔用 4 個位元組,因此其儲存的時間上限只能到‘2038-01-19 03:14:07’。
從 MySQL 5.6 版本開始,類型 TIMESTAMP 也能支援毫秒。與 DATETIME 不同的是,若帶有毫秒時,類型 TIMESTAMP 佔用 7 個位元組,而 DATETIME 無論是否儲存毫秒資訊,都佔用 8 個位元組。
類型 TIMESTAMP 最大的優點是可以帶有時區屬性,因為它本質上是從毫秒轉化而來。如果你的業務需要對應不同的國家時區,那麼類型 TIMESTAMP 是一種不錯的選擇。比如新聞類的業務,通常使用者想知道這篇新聞釋出時對應的自己國家時間,那麼 TIMESTAMP 是一種選擇。Timestamp 類型欄位的值會隨著伺服器時區的變化而變化,自動換算成相應的時間,說簡單點就是在不同時區,查詢到同一個條記錄此欄位的值會不一樣。
TIMESTAMP 的效能問題
TIMESTAMP 還存在潛在的效能問題。
雖然從毫秒數轉換到類型 TIMESTAMP 本身需要的 CPU 指令並不多,這並不會帶來直接的效能問題。但是如果使用預設的作業系統時區,則每次通過時區計算時間時,要呼叫作業系統底層系統函數 __tz_convert(),而這個函數需要額外的加鎖操作,以確保這時作業系統時區沒有修改。所以,當大規模併發訪問時,由於熱點資源競爭,會產生兩個問題:
效能不如 DATETIME:DATETIME 不存在時區轉化問題。效能抖動:海量併發時,存在效能抖動問題。為了優化 TIMESTAMP 的使用,建議使用顯式的時區,而不是作業系統時區。比如在配置檔案中顯示地設定時區,而不要使用系統時區:
[mysqld]time_zone = "+08:00"
簡單總結一下這兩種資料類型的優缺點:
DATETIME 沒有儲存的時間上限,而TIMESTAMP儲存的時間上限只能到‘2038-01-19 03:14:07’DATETIME 不帶時區屬性,需要前端或者服務端處理,但是僅從資料庫儲存資料和讀取資料而言,效能更好TIMESTAMP 帶有時區屬性,但是每次需要通過時區計算時間,併發訪問時會有效能問題儲存 DATETIME 比 TIMESTAMEP 多佔用一部分空間數值型時間戳(INT)
很多時候,我們也會使用 int 或者 bigint 類型的數值也就是時間戳來表示時間。
這種儲存方式的具有 Timestamp 類型的所具有一些優點,並且使用它的進行日期排序以及對比等操作的效率會更高,跨系統也很方便,畢竟只是存放的數值。缺點也很明顯,就是資料的可讀性太差了,你無法直觀地看到具體時間。
如果需要檢視某個時間段內的資料
select * from t where created_at > UNIX_TIMESTAMP('2021-01-01 00:00:00');
DATETIME vs TIMESTAMP vs INT,怎麼選?
每種方式都有各自的優勢,下面再對這三種方式做一個簡單的對比:
TIMESTAMP 與 INT 本質一樣,但是相比而言雖然 INT 對開發友好,但是對 DBA 以及資料分析人員不友好,可讀性差。至於時區問題,可以由前端或者服務這裡做一次轉化,不一定非要在資料庫中解決。
總結
本文比較了幾種最常使用的儲存時間的方式,我最推薦的還是 DATETIME。理由如下:
TIMESTAMP 比數值型時間戳可讀性更好DATETIME 的儲存上限為 9999-12-31 23:59:59,如果使用 TIMESTAMP,則 2038 年需要考慮解決方案DATETIME 由於不需要時區轉換,所以效能比 TIMESTAMP 好如果需要將時間儲存到毫秒,TIMESTAMP 要 7 個位元組,和 DATETIME 8 位元組差不太多
相關文章
我們平時開發中經常需要記錄時間,比如用於記錄某條記錄的創建時間以及修改時間。在資料庫中儲存時間的方式有很多種,比如 MySQL 本身就提供了日期類型,比如 DATETIME,TIMESTAMEP
2021-07-03 03:04:39
寶貝女兒5歲多了,看到什麼玩具一開始都會顯示出濃厚的興致,但往往是玩幾次就失去了興趣。但是,最近入手的益智玩具——紙上世界AI桌屏互動益智套裝,改變了女兒的這種習慣——每
2021-07-03 03:04:06
今年,小米在高階市場的表現讓人眼前一亮,憑藉安卓之光以及安卓機皇兩款產品,小米在4000元以上價位段拿下不少市場。目前,小米已經成為了高階手機領域最有號召力的品牌之一。事實
2021-07-03 03:04:00
大家知道每一個系統,對應的應用程式都有相應的格式,比如windows下主要以exe的格式程式檔案,當然windows下還有其它的格式檔案,但exe是最常見和通用的。而iOS下則是以IPA格式的程
2021-07-03 03:03:54
1995年元旦剛過,我國著名科學家、兩彈一星功勳獎章獲得者錢學森曾給王壽雲、錢學敏、塗元秀等科學家寫過一封親筆信,信中對當時國內的科學創新提出了反思,並提出了著名的「錢學
2021-07-03 03:03:42
除了旗下的iPhone外,蘋果的iPad也是備受使用者喜愛的產品系列。也正是因此,每隔一段時間蘋果都會進行產品更新,為使用者帶來更新的技術支援。 最新的報道中提到,蘋果有可能會在
2021-07-03 03:03:36