ホームページ > php教程 > php手册 > MySQL の時間フィールドに INT と DateTime のどちらを使用するかについての手順

MySQL の時間フィールドに INT と DateTime のどちらを使用するかについての手順

WBOY
リリース: 2016-06-13 12:01:56
オリジナル
1095 人が閲覧しました

今天解析DEDECMS时发现deder的MYSQL时间字段,都是用

`senddata` int(10) unsigned NOT NULL DEFAULT '0';

随后又在网上找到这篇文章,看来如果时间字段有参与运算,用int更好,一来检索时不用在字段上转换运算,直接用于时间比较!二来如下所述效率也更高。

归根结底:用int来代替data类型,更高效。

环境:

Windows XP
PHP Version 5.2.9
MySQL Server 5.1

第一步、创建一个表date_test(非定长、int时间)

CREATE TABLE `test`.`date_test` (
`id` INT NOT NULL AUTO_INCREMENT ,
`start_time` INT NOT NULL ,
`some_content` VARCHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB;

第二步、创建第二个表date_test2(定长、int时间)

CREATE TABLE `test`.`date_test2` (
`id` INT NOT NULL AUTO_INCREMENT ,
`start_time` INT NOT NULL ,
`some_content` CHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB;

第三步、创建第三个表date_test3(varchar、datetime时间)

CREATE TABLE `test`.`date_test3` (
`id` INT NOT NULL AUTO_INCREMENT ,
`start_time` DATETIME NOT NULL ,
`some_content` VARCHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB;

第四步、创建第四个表date_test3(char、datetime时间)

CREATE TABLE `test`.`date_test4` (
`id` INT NOT NULL AUTO_INCREMENT ,
`start_time` DATETIME NOT NULL ,
`some_content` CHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB;

わかりました。テストを開始します。環境は php です。まず、各テーブルに 100 万個のデータを挿入します。挿入する際は200回に分けて、毎回5,000件をデータベースに入力します。

表 1 の実行記録: ページの実行時間: 26.5997889042 秒 挿入中に興味深い現象が発見されました。SELECT count( id ) FROM `date_test` WHERE 1 の結果は 100w ですが、`date_test から * を直接選択した結果です。 ` は 1,000,374 件の結果です。 (後で、これが近い値であることがわかりました。MySQL FAQ 3.11 を参照してください)。

表 2 の実行レコード: ページの実行時間: 62.3908278942 秒、今回は 1,000,066 レコードがあります。

表 3 の実行記録: ページの実行時間: 30.2576560974 秒、今回は 1,000,224 のエントリがあります。

表 4 の実行記録: ページの実行時間: 67.5393900871 秒、今回: 1,000,073 エントリ。

次に、4 つのテーブルの start_time フィールドにインデックスを 1 つずつ追加します。

4 つのテーブルの更新をテストし、それぞれ 100 レコードを更新し、時間を記録します:

表 1: ページの実行時間: 2.62180089951 秒 (非固定長、整数時間)

表 2: ページの実行時間: 2.5475358963 秒 (固定長、整数時間)

表 3: ページの実行時間: 2.45077300072 秒 (varchar、日時時間)

表 4: ページの実行時間: 2.82798409462 秒 (文字、日時)

4 つのテーブルの読み取りをテストし、それぞれ 100 個のランダム レコードを選択し、主キー ID に基づいてクエリを実行し、時間を記録します。

表 1: ページの実行時間: 0.382651090622 秒 (非固定長、整数時間)

表 2: ページの実行時間: 0.542181015015 秒 (固定長、整数時間)

表 3: ページの実行時間: 0.334048032761 秒 (varchar、日時時間)

表 4: ページの実行時間: 0.506206989288 秒 (文字、日時)

4 つのテーブルの読み取りをテストし、それぞれ 10 個のランダムなレコードを選択し、star_time を条件としてクエリを実行し、時間を記録します。

表 1: ページの実行時間: 30.1972880363 秒 (非固定長、整数時間)

表 2: ページの実行時間: 65.1926910877 秒 (固定長、整数時間)

表 3: ページの実行時間: 39.7210869789 秒 (varchar、datetime 時刻)

表 4: ページの実行時間: 70.4632740021 秒 (文字、日時)

金額が比較的小さいため、小さな変化でも意味があると考えられます。

結論:

データ量が大きい場合、select * from table where time>XX などのクエリが多数ある場合、MySQL5.1 では datetime に int を使用するのが合理的です。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート