web-dev-qa-db-ja.com

mysqlのdatetimeフィールドにインデックスを付けることは良い考えですか?

私は大規模なデータベースの設計に取り組んでいます。私のアプリケーションでは、たとえば、現在400万のレコードを持つ1つのテーブルがあり、多くの行があります。ほとんどのクエリは、datetime句を使用してデータを選択します。 mysqlデータベースの日時フィールドのインデックスを作成することをお勧めしますか?

Select field1, field2,.....,field15
from table where field 20 between now() and now + 30 days 

データベースを正常に動作させ、クエリをスムーズに実行しようとしています。

さらに、高効率のデータベースを作成する必要があると思いますか?

107
Jaylen

MySQLは、条件間の行の削除など、さまざまな理由でインデックスを使用することを推奨しています。 http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

これにより、クエリの条件で頻繁に使用する場合、datetime列はインデックスの優れた候補になります。唯一の条件がBETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY)であり、条件に他のインデックスがない場合、MySQLはすべてのクエリで全テーブルスキャンを実行する必要があります。 30日間に生成される行の数はわかりませんが、合計行の約1/3未満であれば、列のインデックスを使用する方が効率的です。

効率的なデータベースの作成に関するあなたの質問は非常に広範です。正規化され、すべての適切な列にインデックスが付けられていること(つまり、結合およびwhere句で使用されている列)を確認するだけです。

130
Explosion Pills

ここ 著者が行ったテストでは、整数のUnixタイムスタンプがDateTimeよりも優れていることが示されました。注、彼はMySqlを使用しました。しかし、整数を比較するDBエンジンは、日付を比較するよりもわずかに速いため、intインデックスはDateTimeインデックスよりも優れていると感じています。 T1-2つの日付を比較する時間、T2-2つの整数を比較する時間を取ります。インデックス付きフィールドでの検索には、バランスのとれたツリーに基づくインデックスがあるため、およそO(log(rows))時間かかります。DBエンジンによって異なる場合がありますが、とにかくLog(rows)は一般的な推定です。 (ビットマスクまたはrツリーベースのインデックスを使用しない場合)。違いは(T2-T1)* Log(rows)です-クエリを頻繁に実行する場合に役割を果たす可能性があります。

15
Baurzhan