MySQL では、datetime 型は通常、時間を保存するために使用されますが、現在では多くのシステムで、Unix タイムスタンプを保存するために int も使用されています。これらの違いは何でしょうか?私の要約は次のとおりです。 整数 (1)4バイトのストレージ。INTの長さは4バイトで、データタイムよりもストレージスペースが少なくて済みます。intインデックスのストレージスペースも比較的小さく、ソートとクエリの効率も比較的高いです。 (2)可読性が極めて悪く、データを直感的に見ることができない タイムスタンプ (1)4バイトストレージ (2)値はUTC形式で保存される (3)タイムゾーン変換:保存時に現在のタイムゾーンに変換し、取得時に現在のタイムゾーンに戻します。 (4)TIMESTAMP値は1970年より前または2037年より後にすることはできません 日時 (1)8バイトのストレージ (2)時間帯とは関係ない (3)DATETIME値を「YYYY-MM-DD HH:MM:SS」形式で取得し表示する。サポートされる範囲は「1000-01-01 00:00:00」から「9999-12-31 23:59:59」です。 MySQL のパフォーマンスがどんどん高くなるにつれて、時間の保存方法は個人の習慣やプロジェクトの要件に依存すると思います。 int と timestamp と datetime のパフォーマンス テストに関する 2 つの記事を共有します。 MySQL DATETIME vs TIMESTAMP vs INT テスター テーブル `test_datetime` を作成します ( `id` int(10) 符号なし NOT NULL AUTO_INCREMENT, `datetime` フィールドタイプがNULLではありません。 主キー (`id`) )ENGINE=MyISAM; モデル構成
テスト
mysqlを実行する mysql> test_datetime から * を選択して、出力ファイル '/tmp/test_datetime.sql' に移動します。 クエリは正常、10000000 行が影響を受けました (6.19 秒) mysql> test_timestamp から * を選択して、出力ファイル '/tmp/test_timestamp.sql' に移動します。 クエリは正常、10000000 行が影響を受けました (8.75 秒) mysql> test_int から * を選択して、出力ファイル '/tmp/test_int.sql' に移動します。 クエリは正常、10000000 行が影響を受けました (4.29 秒) test_datetime テーブルを変更し、test_int の名前を変更します。 test_int テーブルを変更し、datetimeint 列を追加します (INT NOT NULL)。 test_int を更新し、datetimeint を UNIX_TIMESTAMP(datetime) に設定します。 テーブル test_int を変更し、列 datetime を削除します。 テーブル test_int を変更し、列 datetimeint を変更します。datetime int は null ではありません。 test_int から * を選択して、出力ファイル '/tmp/test_int2.sql' に格納します。 テーブル test_int を削除します。 これで、DATETIME テストからまったく同じタイムスタンプが得られ、TIMESTAMP テストでも元のタイムスタンプを再利用できるようになります。
予想どおり、INT はそのまま保存されますが、他のものは再計算する必要があります。TIMESTAMP は DATETIME のストレージ サイズの半分を使用しているにもかかわらず、パフォーマンスが依然として低下していることに注意してください。 フルテーブルスキャンのパフォーマンスを確認してみましょう。 mysql> SELECT SQL_NO_CACHE count(id) FROM test_datetime WHERE datetime > '1970-01-01 01:30:00′ AND datetime < '1970-01-01 01:35:00′; ++————–+ | カウント(ID) | ++————–+ |211991| ++————–+ セット1列目(3.93秒) mysql> SELECT SQL_NO_CACHE count(id) FROM test_timestamp WHERE datetime > '1970-01-01 01:30:00′ AND datetime < '1970-01-01 01:35:00′; ++————–+ | カウント(ID) | ++————–+ |211991| ++————–+ セット1列目(9.87秒) mysql> SELECT SQL_NO_CACHE count(id) FROM test_int WHERE datetime > UNIX_TIMESTAMP('1970-01-01 01:30:00′) AND datetime < UNIX_TIMESTAMP('1970-01-01 01:35:00′); ++ ... | カウント(ID) | ++ ... |211991| ++————–+ セット1列目(15.12秒) しかし、TIMESTAMP のパフォーマンスは低下し、再計算が影響しているように思われたので、次にテストするのに適した方法は、再計算を行わないことであるように思われました。つまり、UNIX_TIMESTAMP() 値に相当する値を見つけて、代わりにそれを使用します。 mysql> UNIX_TIMESTAMP('1970-01-01 01:30:00′) AS lower、UNIX_TIMESTAMP('1970-01-01 01:35:00′) AS bigger を選択します。 +——-+——–+ | 低く | 大きく | +——-+——–+ | 1800 | 2100 | +——-+——–+ セット内の 1 行 (0.00 秒) mysql> SELECT SQL_NO_CACHE count(id) FROM test_int WHERE datetime > 1800 AND datetime < 2100; ++————–+ | カウント(ID) | ++————–+ |211991| ++————–+ セット1列目(1.94秒) MySQL DATETIME vs TIMESTAMP vs INT パフォーマンスと InnoDB を使用したベンチマーク 要約する 以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。 以下もご興味があるかもしれません:
|
<<: JavaScriptでシンプルなスクロールウィンドウを実装する
>>: VMwareがモジュールディスクを早期に開けない場合の解決策の詳細な説明
目次1. 関数バインディング2. パラメータと$eventを使用する3. 1つのイベントに複数の関数...
結果:実装コードhtml <nav class="dropdownmenu"...
この記事の例では、ログインと登録を実装するためのspringboot+VUEの具体的なコードを参考ま...
目次Linux ドライバーの共通機能 (copy_from_user open read write...
目次1. binlogの3つのモード1.ステートメントレベルモード2. 行レベルモード3. 混合モー...
「mysqlは内部コマンドではありません」というエラーは、mysqlのbinディレクトリパスが環境変...
私は長い間この問題に悩まされていましたが、検索してみたところ、実際にこの問題を解決した人がいることが...
NetEase Blog で HTML を使用する場合、テンプレートに直接コードを追加できることは...
この記事では主に、CSS3 フレックスレイアウトを使用して要素を均等に配置する方法を紹介します。自分...
目次概要1. アプリケーションレベルのミドルウェア2. 組み込みミドルウェア3. サードパーティミド...
Nginxは正規表現を使用して、ワイルドカードドメイン名をディレクトリに自動的に一致させます。 Ng...
シナリオ: 検査文書には n 個の検査詳細があり、検査詳細には n 個の検査項目があります。実装効果...
<br />以前、「コンテンツページ番号のプレビューナビゲーション」と「写真プレビューナ...
目次1. tomcatの起源1. Tomcat アプリケーションのシナリオ2. Tomcatに必要な...
1. Zabbixバックアップ [root@iZ2zeapnvuohe8p14289u6Z /]# ...