2017-05-02 25 views
-1

在mysql中我可以有一個由自動增量和另一個字段組成的複合主鍵嗎?另外,請批評我的「MySQL分區」的邏輯ysql中複合鍵的分區

爲了解釋further->

我有一個關於MySQL分區查詢。 我必須在MySQL中對錶進行分區,它有一個主鍵ID。 我必須按日期字段進行分區(非主要重複條目)。 因爲我們不能在重複條目上進行分區,所以我創建了一個組合鍵 - >(id,date)。 如何在這個組合鍵中創建分區?

在此先感謝...

回答

0

(這個回答假設InnoDB的,而不是MyISAM數據。有跡象表明,讓我的一些意見對MyISAM不正確索引中的實現差異。)

在MySQL中,一個表格的PRIMARY KEY可以由多個字段組成,包括AUTO_INCREMENT

在MySQL爲AUTO_INCREMENT唯一的要求是,它是在一些索引第一柱。讓我們來看看Posts,這個例子那裏可以爲每個用戶很多帖子:

PRIMARY KEY(user_id, post_id), 
INDEX(post_id) 

其中post_idAUTO_INCREMENT,但你可以從「集羣」中的數據通過user_id受益。該集羣將使其更有效地做查詢,如

SELECT ... FROM Posts 
    WHERE user_id = 1234; 

回到你的問題......

「分區鍵」並不一定是唯一的;所以,我不理解你的「不能在重複條目上分區」。

INDEX(id, date),如果你也有PRIMARY KEY(id),實質上是無用的。當通過id查找時,PRIMARY KEY(id)爲您提供完美的訪問;將date添加到索引將無濟於事。當通過date,而不是id,(id, date)查找時是無用的,因爲只能使用組合索引的「左」部分。

也許你正導致非分區表

PRIMARY KEY(date, id), 
INDEX(id) 

,使日期範圍有效? (注意:分區不會幫助。)

也許你會做

SELECT ... WHERE x = 123 AND date BETWEEN ... 

在這種情況下,這是有利的:

INDEX(x, date) 

只有當你做到這一點,我們可以開始討論分區的效用:

WHERE x BETWEEN ... 
    AND date BETWEEN ... 

這需要一個「二維」索引,它與SPATIAL存在哪種類型。

請參閱my discussion of partitioning其中我只列出了4個分區用例。它還鏈接到關於如何使用2D分區的討論。

底線:您一定不能討論分區,而不清楚它可能會幫助哪些查詢。提供他們;那麼我們可以進一步討論。