我有如下表:我應該使用分區,在這種情況下
CREATE TABLE `connections` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id_from` int(11) NOT NULL,
`user_id_to` int(11) NOT NULL,
`counter` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `to_from` (`user_id_to`,`user_id_from`),
KEY `user_id_from` (`user_id_from`)
) ENGINE=InnoDB AUTO_INCREMENT=1559108041 DEFAULT CHARSET=utf8
這是103GB(43GB的數據和59GB指數)和大約〜1143663061行。我認爲主要的性能障礙是索引大小的結果,因此解決方案可能意味着將其減小爲小型索引(分區)。我正在考慮添加一個DATE字段,並按月進行分區。每次只能查詢最近的X個月(X將在6左右),我可以忍受。我看到的騙局是這會導致桌子變得比現在更大。
在我測試基準之前,你會推薦這個嗎?你有其他建議嗎?
更新: 我使用這個表的查詢:
SELECT * FROM connections WHERE user_id_to=x LIMIT 3000
SELECT * FROM connections WHERE user_id_from=x ORDER BY counter DESC LIMIT 100
SELECT user_id_from, counter FROM connections WHERE user_id_to IN (x1, x2, ..., x1000) LIMIT 500
SELECT * FROM connections WHERE user_id_to=x AND user_id_from IN (x1, x2, ..., x1000) LIMIT 1000
我通過user_id_to爲主要條件,也user_id_from爲主要查詢的原因條件,是否有連接是有方向性的,並且我正在尋找相互連接(從→到>從& &從 - >到)。 WHERE user_id_to
的行數可能會非常高,因爲WHERE user_id_from
大多不是那麼多,這就是爲什麼當我ORDER BY counter
我沒有爲此添加索引時。
查看下面的答案可能會刪除您的索引之一。另外,奇怪的是你會有'_from'和'_to'和INT字段而不是日期字段。在整個表格中保持它們的獨特性意味着沒有兩個用戶可以有相同的開始和結束日期,這也很奇怪。 – aneroid
_「在我測試基準之前...」 - - 您應該首先對**進行基準測試,並確定確切的查詢速度緩慢(以及它們的計時和執行計劃)。替代鍵「id」是否有[特定原因](http://stackoverflow.com/tags/surrogate-key/info)?如果不是,則可以忽略它,並使用'{user_id_to,user_id_from}'作爲主鍵,從而減少所需的存儲空間。除此之外,我懷疑'{user_id_from,user_id_to}'上的複合索引可能比單獨使用'{user_id_from}'更好。但所有這些都是猜測而不知道你的疑問。 –
@BrankoDimitrijevic有趣的想法刪除代理鍵。它沒有任何特定的原因,但是在某些情況下我發現它們很有用(例如,當想要以塊的形式迭代表格時)。 '{user_id_from,user_id_to}'索引不會比'{user_id_from}'大嗎?你爲什麼懷疑它會爲我提供更好的服務?有關分區選項的任何想法? – Noam