ホームページ  >  記事  >  バックエンド開発  >  MySQL の時間フィールドに INT と DateTime のどちらを使用するかに関する手順_PHP チュートリアル

MySQL の時間フィールドに INT と DateTime のどちらを使用するかに関する手順_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:20:261006ブラウズ

今天解析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;

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

表 1 の実行記録: ページ実行時間: 26.5997889042 秒 挿入中に興味深い現象が発見されました。SELECT count( id ) FROM `date_test` WHERE 1 の結果は 100 万ですが、`date_test からの直接 select * の結果です。 ` は 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、日時時間)

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

金額が比較的小さいため、小さな変更でも意味があるとデフォルトで設定されています。

結論:

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

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/325104.html技術記事今日 DEDECMS を解析すると、deder の MYSQL の時間フィールドがすべて `senddata` int(10) unsigned NOT NULL DEFAULT '0'; を使用していることがわかりました。その後、インターネットでこの記事を見つけました。 ..
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。