2016-09-06 66 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' 

問: 如果我創建了兩個列名爲年份和月份,和指數一個月,一年,而用戶加快查詢?

+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和用戶嗎? – Alvin

+1

我所做的更改特別依賴'dateCreated'上的索引有用;但在'用戶'上有一個,或者在兩個字段上都有一個,應該也會有幫助。從更大的角度來看,這取決於您希望如何定期查詢數據。例如,如果您在沒有'dateCreated'的'user'查詢的情況下,'(dateCreated,user)'索引不會有幫助,但如果您希望經常在沒有'user的'dateCreated'上進行查詢,那麼它仍然會很有幫助'。 – Uueerdo

+0

好吧,我會upvote,即使OP不會 – Strawberry