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


137

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

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

データベースを適切に機能させ、クエリがスムーズに実行されるようにしています

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


なにfield 20
AlikElzin-kilaka

回答:


164

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
ご説明ありがとうございます。それは本当に役立ちます。私はそれにもっとフィルターを持っていると確信しています。日時フィールドが重複している可能性があるため、日時フィールドのインデックス作成が適切かどうかを確認したいだけです。しかし、あなたは答えてそれを説明しました:)ありがとう
ジェイレン

4
「結合およびwhere句で使用されるもの」の+1。インデックス作成戦略の優れた経験則。自明のことですが、今まで考えたことはありませんでした
Gaz_Edge 2014年

1
ただし、「2017-01-01 11:20」から「2018-01-03 12:12」までのデータ範囲など、日付範囲を指定してデータをクエリすると、列SELECTにインデックスを作成してもクエリが速くなりませんdate time。 ..インデックスを使用すると、equal操作を使用したときにクエリが高速になります。
user3595632 2018

1
DAY(datetime)やHOUR(datetime)のような時間関数で日時フィールドをクエリする場合はどうでしょうか。この場合、インデックスは役立ちますか、または妨げますか?
cronoklee 2018年

@Explosion Pillsさん、年と月に基づいてテーブルをクエリするだけでよい場合、日時列のインデックスを直接作成するのではなく、年と月のみの新しい列を作成してからインデックスを作成すると、パフォーマンスが向上します?私は、その値が201801.のようなものである列の作成このようなことのように
ウッズ陳

18

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


ありがとうございました。私はそれをオプションとして考えていましたが、それに取り組む方法がわかりませんでした。私はあなたが絶対的に正しいと信じています整数は常に速いです。
Jaylen 2013年

62
いい?UNIXタイムスタンプがすべての場合に適しているとは思えません。はい、整数を格納する方が文字列を格納するよりも一般的に高速ですが、MySQLが公開するすべてのDateTime関数についてはどうですか?これらを自分で実装すると、パフォーマンスや機能に悪影響を及ぼします。
グレッグ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.