在mysql中我可以有一個由自動增量和另一個字段組成的複合主鍵嗎?另外,請批評我的「MySQL分區」的邏輯ysql中複合鍵的分區
爲了解釋further->
我有一個關於MySQL分區查詢。 我必須在MySQL中對錶進行分區,它有一個主鍵ID。 我必須按日期字段進行分區(非主要重複條目)。 因爲我們不能在重複條目上進行分區,所以我創建了一個組合鍵 - >(id,date)。 如何在這個組合鍵中創建分區?
在此先感謝...
在mysql中我可以有一個由自動增量和另一個字段組成的複合主鍵嗎?另外,請批評我的「MySQL分區」的邏輯ysql中複合鍵的分區
爲了解釋further->
我有一個關於MySQL分區查詢。 我必須在MySQL中對錶進行分區,它有一個主鍵ID。 我必須按日期字段進行分區(非主要重複條目)。 因爲我們不能在重複條目上進行分區,所以我創建了一個組合鍵 - >(id,date)。 如何在這個組合鍵中創建分區?
在此先感謝...
(這個回答假設InnoDB的,而不是MyISAM數據。有跡象表明,讓我的一些意見對MyISAM不正確索引中的實現差異。)
在MySQL中,一個表格的PRIMARY KEY
可以由多個字段組成,包括AUTO_INCREMENT
。
在MySQL爲AUTO_INCREMENT
唯一的要求是,它是在一些索引的第一柱。讓我們來看看Posts
,這個例子那裏可以爲每個用戶很多帖子:
PRIMARY KEY(user_id, post_id),
INDEX(post_id)
其中post_id
爲AUTO_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分區的討論。
底線:您一定不能討論分區,而不清楚它可能會幫助哪些查詢。提供他們;那麼我們可以進一步討論。