1. 程式人生 > >mysql 時間字段介紹

mysql 時間字段介紹

ado date_add 5.7 assign format spec pro 技術 epo

mysql時間類型大概有5種,如下圖
技術分享圖片

1、創建數據庫

create table t1 (
    id  int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    d1_data date,
    d2_time time,
    d3_datatime datetime,
    d4_year year,
    d5_timestamp TIMESTAMP
);

字符串方式插入

INSERT  INTO t1 (d1_data,d2_time,d3_datatime,d4_year,d5_timestamp) VALUES(NOW(),NOW(),NOW(),NOW(),NOW());
mysql> select * from t1 where id=1\G
*************************** 1. row ***************************
          id: 1
     d1_data: 2018-06-15
     d2_time: 13:50:25
 d3_datatime: 2018-06-15 13:50:25
     d4_year: 2018
d5_timestamp: 2018-06-15 13:50:25
1 row in set (0.00 sec)

INSERT  INTO t1 (d1_data,d2_time,d3_datatime,d4_year,d5_timestamp) VALUES(‘2018-06-15‘,‘13:50:25‘,‘2018-06-15 13:50:25‘,‘2018‘,‘2018-06-15 13:50:25‘);
mysql> select * from t1 where id=2\G
*************************** 1. row ***************************
          id: 2
     d1_data: 2018-06-15
     d2_time: 13:50:25
 d3_datatime: 2018-06-15 13:50:25
     d4_year: 2018
d5_timestamp: 2018-06-15 13:50:25
1 row in set (0.00 sec)

1.1、date (數字插入)

mysql> help DATE
A date. The supported range is ‘1000-01-01‘ to ‘9999-12-31‘. MySQL
displays DATE values in ‘YYYY-MM-DD‘ format, but permits assignment of
values to DATE columns using either strings or numbers.

插入時候可以是字符串或者數字
20180615
‘2018-06-15‘

1.2、time (數字插入)

mysql> help TIME
A time. The range is ‘-838:59:59.000000‘ to ‘838:59:59.000000‘. MySQL
displays TIME values in ‘HH:MM:SS[.fraction]‘ format, but permits
assignment of values to TIME columns using either strings or numbers.

An optional fsp value in the range from 0 to 6 may be given to specify
fractional seconds precision. A value of 0 signifies that there is no
fractional part. If omitted, the default precision is 0.

mysql> INSERT  INTO t1 (d1_data,d2_time,d3_datatime,d4_year,d5_timestamp) VALUES(20180515,135025,‘2018-06-15 13:50:25‘,‘2018‘,‘2018-06-15 13:50:25‘);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1 where id=4\G
*************************** 1. row ***************************
          id: 4
     d1_data: 2018-05-15
     d2_time: 13:50:25
 d3_datatime: 2018-06-15 13:50:25
     d4_year: 2018
d5_timestamp: 2018-06-15 13:50:25
1 row in set (0.00 sec)

1.3、 DATETIME (數字插入)

mysql> help DATETIME
A date and time combination. The supported range is ‘1000-01-01
00:00:00.000000‘ to ‘9999-12-31 23:59:59.999999‘. MySQL displays
DATETIME values in ‘YYYY-MM-DD HH:MM:SS[.fraction]‘ format, but permits
assignment of values to DATETIME columns using either strings or
numbers.

An optional fsp value in the range from 0 to 6 may be given to specify
fractional seconds precision. A value of 0 signifies that there is no
fractional part. If omitted, the default precision is 0.

Automatic initialization and updating to the current date and time for
DATETIME columns can be specified using DEFAULT and ON UPDATE column
definition clauses, as described in
http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html.

20180615135025
‘2018-06-15 13:50:25‘
存儲的是字符串

mysql> INSERT  INTO t1 (d1_data,d2_time,d3_datatime,d4_year,d5_timestamp) VALUES(20180515,135025,20180615135025,‘2018‘,‘2018-06-15 13:50:25‘);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1 where id=5\G
*************************** 1. row ***************************
          id: 5
     d1_data: 2018-05-15
     d2_time: 13:50:25
 d3_datatime: 2018-06-15 13:50:25
     d4_year: 2018
d5_timestamp: 2018-06-15 13:50:25
1 row in set (0.00 sec)

1.4、 year

mysql> help year
Returns the year for date, in the range 1000 to 9999, or 0 for the
"zero" date.

1.5、 timestamp (數字插入)

mysql> help timestamp
A timestamp. The range is ‘1970-01-01 00:00:01.000000‘ UTC to
‘2038-01-19 03:14:07.999999‘ UTC. TIMESTAMP values are stored as the
number of seconds since the epoch (‘1970-01-01 00:00:00‘ UTC). A
TIMESTAMP cannot represent the value ‘1970-01-01 00:00:00‘ because that
is equivalent to 0 seconds from the epoch and the value 0 is reserved
for representing ‘0000-00-00 00:00:00‘, the "zero" TIMESTAMP value.
存儲的是時間戳
mysql> INSERT  INTO t1 (d1_data,d2_time,d3_datatime,d4_year,d5_timestamp) VALUES(20180515,135025,20180615135025,‘2018‘,20180615135025);
Query OK, 1 row affected (0.01 sec)

總結

以上說明 在插入或者更新時候,值可以是 ‘2018-06-06‘ 時間類型字符串 也可以是 20180606 數字,都會經過mysql函數處理存入

100w條數據 比較datatime跟timestamp效率

2、 準備100w條數據

drop PROCEDURE  autoinsert;

DELIMITER $$
create PROCEDURE autoinsert()
  BEGIN
    DECLARE i int DEFAULT 1;
    DECLARE mytime varchar(19) ;
    WHILE (i<1000000) DO
      set mytime=date_add(now(),interval i second);
      INSERT into t1  (d1_data,d2_time,d3_datatime,d4_year,d5_timestamp) VALUES (mytime,mytime,mytime,date_add(now(),interval i second),mytime);
      set i=i+1;
    END WHILE ;
  END $$
DELIMITER ;

CALL autoinsert();

技術分享圖片

2.1、datetime 分析:

沒有索引情況下:

技術分享圖片
技術分享圖片

大概需要0.22s

添加索引

mysql> alter table t1 add key (d3_datatime);

技術分享圖片
技術分享圖片

2.2、timestamp分析

沒有索引情況下:
技術分享圖片
技術分享圖片

需要0.4s左右

添加索引情況後:

ALTER TABLE `t1` add key (d5_timestamp);

技術分享圖片技術分享圖片


100w條數據的理論,datetime比timestamp更快點,底層比較應該都是數字,timestamp可能在時間轉換上消耗更好點吧,在加上索引情況下是沒有區別的,從空間上考慮datetime需要8個字節,而timestamp只要4個字節。

mysql 時間字段介紹