2016-09-06 3 views
0

をスピードアップするために月と年の列を作成します。私はmariadb/MySQLで大きなログテーブルを持っているタイムスタンプクエリ

CREATE TABLE `logs` (
    `id` CHAR(36) NOT NULL, 
    `user` CHAR(4) NOT, NULL, 
    `dateCreated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `dateUpdated` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (`id`) 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoDB 

私は月と年によって作成されたユーザおよび日付に基づいてログを照会しようとしています:

select * from logs where month(dateCreated) = '9' and year(dateCreated) = '2016' and user = '1234' 

質問: 私は、クエリをスピードアップするために、2つの月と年と呼ばれる列、およびインデックス月、年、およびユーザーが作成したでしょうか?

+0

ベンチマークそれは両方の方法。列を作成/維持するオーバーヘッドは、データをキャッシュすることによる利益を非常に上回る可能性があります。 –

+0

PKはテーブルに存在しない列です。ブリリアント! – Strawberry

+0

とにかく日付を日付として保存します。また、範囲クエリを使用します。 – Strawberry

答えて

3

ちょうど良く、フィールド上で可能なインデックスを利用するために、クエリの基準を再構築したほうが良いです:

WHERE dateCreated >= '2016-09-01 00:00:00' 
    AND dateCreated < '2016-10-01 00:00:00' 
    AND user = '1234' 
+0

dateCreatedとuserのインデックスを作成する必要がありますか? – Alvin

+1

私が変更したのは、特に 'dateCreated'のインデックスに依存しています。しかし、「ユーザ」上に1つ、または両方のフィールドに1つの組み合わせを持つことも有用であるはずです。より大きな画像では、データを定期的に照会する方法に大きく依存します。たとえば、 '(dateCreated、user)'インデックスは 'dateCreated'なしで' user'に基づいてクエリを実行する場合には役立ちませんが、 'dateCreated'で' user '。 – Uueerdo

+0

OPが届かない場合でも、私はupvoteします – Strawberry

関連する問題