今天解析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 を使用するのが合理的です。