2013-03-15 2 views
80

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

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

私は良い作業私のデータベースを維持しようとしていますし、クエリがスムーズ

より実行され、どのようなアイデア私は、高効率のデータベースを作成する必要がありますと思いますか?

答えて

102

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句で使用される列)。

+3

ありがとうございます。それは本当に助けになる。私はそれにもっと多くのフィルターを付けると確信しています。私はちょうど私たちが日付の時間が重複する可能性があるので、日時フィールドのインデックス作成が良いアイデアかどうかを確認したい。しかし、あなたはそれを説明答えた:)ありがとう – Jaylen

+3

+1は 'ジョインズとwhere節で使用されているもの'です。インデックス作成戦略の大きな経験則です。明らかに今私はそれについて考えるが、前に私に起こっていなかった –

7

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

+0

ありがとう。私はそれをオプションとして考えていましたが、それに近づく方法を知らなかったのです。私はあなたが絶対に正しい整数は常により速いと信じています。 – Jaylen

+26

もっと良いですか?私はUNIXのタイムスタンプが_all_の場合には良いとは思わない。はい、整数を格納するのは一般的に文字列を格納するよりも高速ですが、[DateTime functions](http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html)はどうでしょうか? )MySQLは公開していますか?それらを自分で実装すると、パフォーマンスや機能に悪影響を及ぼします。 – Greg

関連する問題