<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          MySQL 時(shí)間類型 datetime、bigint、timestamp,選哪個(gè)?

          共 4768字,需瀏覽 10分鐘

           ·

          2021-09-02 22:48

          程序員的成長之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享 
          關(guān)注


          閱讀本文大概需要 2.8 分鐘。
          來自:juejin.im/post/6844903701094596615
          數(shù)據(jù)庫中可以用datetime、bigint、timestamp來表示時(shí)間,那么選擇什么類型來存儲(chǔ)時(shí)間比較合適呢?

          前期數(shù)據(jù)準(zhǔn)備

          通過程序往數(shù)據(jù)庫插入50w數(shù)據(jù)
          • 數(shù)據(jù)表:

          CREATE TABLE `users` (
            `id` int(11) NOT NULL AUTO_INCREMENT,
            `time_date` datetime NOT NULL,
            `time_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            `time_long` bigint(20) NOT NULL,
            PRIMARY KEY (`id`),
            KEY `time_long` (`time_long`),
            KEY `time_timestamp` (`time_timestamp`),
            KEY `time_date` (`time_date`)
          ) ENGINE=InnoDB AUTO_INCREMENT=500003 DEFAULT CHARSET=latin1

          其中time_long、time_timestamp、time_date為同一時(shí)間的不同存儲(chǔ)格式
          • 實(shí)體類users

          /**
           * @author hetiantian
           * @date 2018/10/21
           * */
          @Builder
          @Data
          public class Users {
              /**
               * 自增唯一id
               * */
              private Long id;

              /**
               * date類型的時(shí)間
               * */
              private Date timeDate;

              /**
               * timestamp類型的時(shí)間
               * */
              private Timestamp timeTimestamp;

              /**
               * long類型的時(shí)間
               * */
              private long timeLong;
          }

          • dao層接口

          /**
           * @author hetiantian
           * @date 2018/10/21
           * */
          @Mapper
          public interface UsersMapper {
              @Insert("insert into users(time_date, time_timestamp, time_long) value(#{timeDate}, #{timeTimestamp}, #{timeLong})")
              @Options(useGeneratedKeys = true,keyProperty = "id",keyColumn = "id")
              int saveUsers(Users users);
          }

          • 測試類往數(shù)據(jù)庫插入數(shù)據(jù)

          public class UsersMapperTest extends BaseTest {
              @Resource
              private UsersMapper usersMapper;

              @Test
              public void test() {
                  for (int i = 0; i < 500000; i++) {
                      long time = System.currentTimeMillis();
                      usersMapper.saveUsers(Users.builder().timeDate(new Date(time)).timeLong(time).timeTimestamp(new Timestamp(time)).build());
                  }
              }
          }

          sql查詢速率測試

          • 通過datetime類型查詢:

          select count(*) from users where time_date >="2018-10-21 23:32:44" and time_date <="2018-10-21 23:41:22"

          耗時(shí):0.171
          • 通過timestamp類型查詢
          select count(*) from users where time_timestamp >= "2018-10-21 23:32:44" and time_timestamp <="2018-10-21 23:41:22"
          耗時(shí):0.351
          • 通過bigint類型查詢

          select count(*) from users where time_long >=1540135964091 and time_long <=1540136482372

          耗時(shí):0.130s
          • 結(jié)論 在InnoDB存儲(chǔ)引擎下,通過時(shí)間范圍查找,性能bigint > datetime > timestamp

          sql分組速率測試

          使用bigint 進(jìn)行分組會(huì)每條數(shù)據(jù)進(jìn)行一個(gè)分組,如果將bigint做一個(gè)轉(zhuǎn)化在去分組就沒有比較的意義了,轉(zhuǎn)化也是需要時(shí)間的
          • 通過datetime類型分組:

          select time_date, count(*) from users group by time_date

          耗時(shí):0.176s
          • 通過timestamp類型分組:

          select time_timestamp, count(*) from users group by time_timestamp

          耗時(shí):0.173s
          • 結(jié)論 在InnoDB存儲(chǔ)引擎下,通過時(shí)間分組,性能timestamp > datetime,但是相差不大

          sql排序速率測試

          • 通過datetime類型排序:

          select * from users order by time_date

          耗時(shí):1.038s
          • 通過timestamp類型排序

          select * from users order by time_timestamp

          耗時(shí):0.933s
          • 通過bigint類型排序

          select * from users order by time_long

          耗時(shí):0.775s
          • 結(jié)論 在InnoDB存儲(chǔ)引擎下,通過時(shí)間排序,性能bigint > timestamp > datetime

          小結(jié)

          如果需要對(duì)時(shí)間字段進(jìn)行操作(如通過時(shí)間范圍查找或者排序等),推薦使用bigint,如果時(shí)間字段不需要進(jìn)行任何操作,推薦使用timestamp,使用4個(gè)字節(jié)保存比較節(jié)省空間,但是只能記錄到2038年記錄的時(shí)間有限。
          <END>

          推薦閱讀:

          XShell收費(fèi)太貴?快試試開源的NuShell,好用!

          你真的會(huì)寫for循環(huán)嗎?來看看這些常見的for循環(huán)優(yōu)化方式

          最近面試BAT,整理一份面試資料《Java面試BATJ通關(guān)手冊(cè)》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。

          獲取方式:點(diǎn)個(gè)「在看」,點(diǎn)擊上方小卡片,進(jìn)入公眾號(hào)后回復(fù)「面試題」領(lǐng)取,更多內(nèi)容陸續(xù)奉上。

          朕已閱 

          瀏覽 48
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日批视频大全在线 | 日本成人在线不卡 | 金先生大韩航空模特 | 人气精品一区二区 | 欧美高潮性爱中文字幕在线播放 |