MySQL データベースでは、datetime、bigint、timestamp を使用して時間の選択を表します。時間を保存するのに最も効率的なのはどれですか?

MySQL データベースでは、datetime、bigint、timestamp を使用して時間の選択を表します。時間を保存するのに最も効率的なのはどれですか?

データベースでは、datetime、bigint、timestamp を使用して時間を表すことができます。では、時間を保存するにはどの型を選択するのが適切でしょうか?

# データ準備後

プログラムを通じて50wのデータをデータベースに挿入する

データシート:

テーブル「users」を作成します(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `time_date` 日時 NOT NULL、
  `time_timestamp` タイムスタンプ NOT NULL デフォルト CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP、
  `time_long` bigint(20) NOT NULL,
  主キー (`id`)、
  キー `time_long` (`time_long`),
  キー `time_timestamp` (`time_timestamp`)、
  キー `time_date` (`time_date`)
) エンジン=InnoDB AUTO_INCREMENT=500003 デフォルト文字セット=latin1

このうち、time_long、time_timestamp、time_date は同じ時刻の異なる保存形式です。

エンティティクラスユーザー

/**
 * @author ヘティアン
 * @日付 2018/10/21
 * */
@ビルダー
@データ
パブリッククラスUsers{
    /**
     * 自己増加型のユニークID
     * */
    プライベートな Long ID;

    /**
     * 日付型時刻 * */
    プライベート日付timeDate;

    /**
     *タイムスタンプ型の時刻* */
    プライベートタイムスタンプ timeTimestamp;

    /**
     * 長いタイプの時間 * */
    プライベート長い時間長い;
}

DAO 層インターフェース

/**
 * @author ヘティアン
 * @日付 2018/10/21
 * */
@マッパー
パブリックインターフェースUsersMapper{
    @Insert("ユーザーに挿入(time_date、time_timestamp、time_long) value(#{timeDate}、#{timeTimestamp}、#{timeLong})")
    @Options(useGeneratedKeys = true、keyProperty = "id"、keyColumn = "id")
    int saveUsers(Users ユーザー);
}

テストクラスはデータベースにデータを挿入します

パブリッククラスUsersMapperTestはBaseTestを拡張します{
    @リソース
    プライベートUsersMapperusersMapper;

    @テスト
    パブリックボイドテスト(){
        (int i = 0; i < 500000; i++) の場合 {
            長い時間 = System.currentTimeMillis();
            usersMapper.saveUsers(Users.builder().timeDate(新しいDate(time)).timeLong(time).timeTimestamp(新しいTimestamp(time)).build());
        }
    }
}

データ コードを生成するには、github にアクセスしてください: https://github.com/TiantianUpup/sql-test/ コード生成を使用せずに、sql ファイルを通じてデータをインポートする場合は、記事の最後に sql ファイルのネットワーク ディスク アドレスが添付されています。

# SQLクエリ率テスト

日時型によるクエリ:

time_date >="2018-10-21 23:32:44" かつ time_date <="2018-10-21 23:41:22" の条件を満たすユーザーから count(*) を選択します。

所要時間: 0.171

タイムスタンプタイプによるクエリ

time_timestamp >= "2018-10-21 23:32:44" かつ time_timestamp <="2018-10-21 23:41:22" の条件を満たすユーザーから count(*) を選択します。

所要時間: 0.351

bigint型によるクエリ

time_long >=1540135964091 かつ time_long <=1540136482372 のユーザーから count(*) を選択します。

所要時間: 0.130秒

結論 InnoDBストレージエンジンでは、時間範囲による検索のパフォーマンスは、bigint > datetime > timestampの順です。

# SQL グループレートテスト


グループ化に bigint を使用すると、各データがグループ化されます。グループ化の前に bigint を変換すると、比較する意味がなくなります。変換にも時間がかかります。

日時タイプでグループ化:

time_date でユーザーグループから time_date、count(*) を選択します。

所要時間: 0.176秒

タイムスタンプの種類でグループ化:

time_timestamp でユーザーグループから time_timestamp、count(*) を選択します。

所要時間: 0.173秒

結論: InnoDB ストレージ エンジンでは、時間グループ化により、timestamp > datetime のパフォーマンスになりますが、その差は大きくありません。

# sql ソート率テスト

日時タイプで並べ替え:

ユーザーから * を選択し、time_date で並べ替えます

所要時間: 1.038秒

タイムスタンプの種類で並べ替え

ユーザーから * を選択し、time_timestamp で並べ替えます

所要時間: 0.933秒

bigint型で並べ替え

ユーザーから * を選択し、time_long で並べ替えます

所要時間: 0.775秒

結論: InnoDBストレージエンジンでは、時間順でソートすると、bigint > timestamp > datetimeのパフォーマンスが

# まとめ

時間フィールドに対して操作(時間範囲による検索や並べ替えなど)が必要な場合は、bigint を使用することをお勧めします。時間フィールドに対して操作が必要ない場合は、timestamp を使用することをお勧めします。スペースを節約するために 4 バイトを使用すると便利ですが、記録される時間は 2038 に制限されます。

記事内の SQL ファイルのネットワーク ディスク アドレス: リンク: https://pan.baidu.com/s/1cCRCxtTlPriXMERGsbnb_A 抽出コード: hbq2

MySQL データベースで時間を表すために datetime、bigint、timestamp のどれを選択するか、そしてどれが最も効率的に時間を保存するかについての記事はこれで終わりです。データベースの datetime、bigint、timestamp の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL のタイムスタンプと日付時刻のタイムゾーンの問題によって生じる DTS の落とし穴の詳細な説明
  • MySQL における datetime と timestamp の違いと選択
  • MySQL における datetime と timestamp の違いと使い方
  • Mysql での日付と時刻の比較
  • MySQL における Datetime と Timestamp の使用の概要

<<:  優秀なウェブ開発者が開発スキルを向上させるために知っておくべき10のこと

>>:  近々ブラウザに導入される CSS :is() と :where() の簡単な分析

推薦する

jsを使用してシンプルな虫眼鏡効果を実現します

この記事では、簡単な虫眼鏡効果を実現するためのjsの具体的なコードを参考までに共有します。具体的な内...

React の 3 つの主要属性における Ref の使用に関する詳細な説明

目次クラスコンポーネント機能コンポーネントインタビューのよくある質問: React における ref...

MySQLインデックスが失敗するいくつかの状況の詳細な分析

1. 先頭のあいまいクエリではインデックスを使用できません (「%XX」や「%XX%」など)コード値...

nginx の場所に複数の Proxy_pass メソッドがある

1. まず、nginxの位置情報に関する関連知識を確認しましょう1) 位置マッチング手順: ~ #波...

新しい CSS :where および :is 疑似クラス関数とは何ですか?

:is と :where とは何ですか? :is()と:where()は、セレクターを作成するとき...

CentOS7 は rpm を使用して MySQL 5.7 をインストールするチュートリアル図

1. 4つのrpmパッケージをダウンロードする mysql-コミュニティクライアント-5.7.26-...

Docker は Python Flask+ nginx+uwsgi コンテナを構築します

Nginxをインストールするまずcentosイメージをプルしますdocker pull centos...

MySQL 一時テーブルの簡単な使用法

MySQL 一時テーブルは、一時的なデータを保存する必要がある場合に非常に便利です。一時テーブルは現...

MacOS Catalina アップグレード後の VMware ブラック スクリーン問題に対する完璧な解決策の詳細な説明

MacOS Catalina アップグレード後の VMware ブラック スクリーンに対する完璧なソ...

GZIP 圧縮 Tomcat と Web パフォーマンスの改善プロセス図

1. はじめに最近、あるプロジェクトに取り組んでいたのですが、サーバーからクライアントに返される J...

ログインと登録を実現するSpringboot+VUE

この記事の例では、ログインと登録を実装するためのspringboot+VUEの具体的なコードを参考ま...

ページのレンダリング時間を短縮してページの実行速度を速めます

ブラウザでのページのレンダリング時間をできるだけ短縮するにはどうすればよいでしょうか? この記事は、...

HTML タグ マーキーを使用してスクロール効果を実現する簡単な方法 (必読)

ページの自動スクロール効果は JavaScript で実現できますが、今日偶然、JS 制御なしでさま...