データベースでは、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 グループレートテスト
日時タイプでグループ化: 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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: 優秀なウェブ開発者が開発スキルを向上させるために知っておくべき10のこと
>>: 近々ブラウザに導入される CSS :is() と :where() の簡単な分析
この記事の例では、円形のプログレスバーのドラッグアンドスライドを実現するための具体的なJSコードを紹...
一般的な演算子と JavaScript の演算子の概要カテゴリオペレーター算術演算子+、–、*、/、...
1. Apache Tomcat 公式サイトから Tomcat 圧縮パッケージをダウンロードします。...
1. Apacheをインストールする $ sudo apt update && su...
C++でMySQLに接続する際の参考情報です。具体的な内容は以下のとおりです。 MySQLCon ク...
最近はMySQLのメモをたくさん取っていますが、それは主に会社のOracleが比較的安定していてメン...
echarts コンポーネントの公式ウェブサイト アドレス: https://echarts.apa...
NULL および NOT NULL 修飾子、DEFAULT 修飾子、AUTO_INCREMENT 修...
について最近、Vue を学習する過程で、基本的な知識の練習と強化を目的として、Qunar.com の...
シナリオ: データ量が増加すると、MySQL が配置されているディスクがいっぱいになり、より大きなス...
IE8 や Chrome で上記の設定を使用すると、画面の最大幅に合わせて表示が統一され、各列の幅は...
1. 従来のLRUリンクリストについて簡単に説明するLRU:最も最近使われなかったものLRU リンク...
目次1. 環境設定1.NTPサーバー2. ビジネスサーバー2. NTPサーバーの設定1. chron...
最近、MySQL オンラインでいくつかのデータ異常が発生しましたが、すべて早朝に発生しました。ビジネ...
序文: Webサービスを提供するために、Alibabaクラウドホストを新しくインストールしました。す...