173

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

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

データベースを正常に機能させ、クエリをスムーズに実行し続けようとしています

さらに、高効率のデータベースを作成するには、どのようなアイデアが必要だと思いますか?

4

2 に答える 2

202

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

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

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

于 2013-03-15T05:22:06.163 に答える
21

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

于 2013-03-15T05:30:30.040 に答える