2010-09-27 53 views
0

我的工作目前僅對所有數據存儲使用MySQL(MyISAM)。我們目前擁有300多個網絡服務器和大約150個數據庫。不幸的是,我不得不在30天內編寫一個表結構來支持超過1億行。我們的想法是:MySQL合併表 - 高流量和大量數據

  1. 大批量插入(沒有更新或刪除,並總是在表的末尾)
  2. 1行選擇
  3. 數據超過30天扔掉

最好的解決方案似乎是將每天的表格合併到選擇的合併表格中。確實會有重複的數據,但是SELECT只會根據時間戳和int字段來拉取最近的行。顯然,有30張桌子並不理想,但如此生活。

這種方法是否存在固有缺陷?有沒有其他方法可以解決這個問題(我們被困在5.0)?在創建新的一天表時,在合併表上執行ALTER TABLE時,表鎖定會成爲一個大問題?我們目前有一個表格旋轉結構,但如果我們選擇一個表格來選擇我們希望從舊錶格到新表格的數據,那麼到達1億行時,這個數據將非常緩慢。

還有其他技術可以以優雅的方式實現這一點,但我們的銷售團隊已經出售瞭解決方案,而且我們沒有時間的奢侈。

任何輸入,將不勝感激。

結構:

CREATE TABLE `merge_test_1` (
    `date_stamp` long NOT NULL, 
    `hash` char(32) NOT NULL, 
    `p_id` mediumint(8) unsigned NOT NULL, 
    `a_id` mediumint(8) unsigned NOT NULL, 
    `b_id` mediumint(8) unsigned NOT NULL, 
    PRIMARY KEY (`hash`,`p_id`,`date_stamp`) 
) ENGINE=MyISAM 

查詢例如

SELECT b_id,a_id FROM merge_test WHERE hash='1' AND p_id=1 
ORDER BY date_stamp DESC LIMIT 1 

回答

0

如果我得到這個問題的核心是索引會因爲大批量插入的無果而終,以及基於搜索關閉MAX(id)不符合您的標準... 「SELECT只會根據時間戳和int字段拉最近的行。」

您是否使用視圖測試過此目的?似乎贏得勝利。

E.g.

CREATE TABLE lotsofdata (
id INT UNSIGNED AUTO_INCREMENT, 
int_val INT UNSIGNED, 
the_timestamp TIMESTAMP, 
PRIMARY KEY(id)); 
-- 
CREATE VIEW FROM 
SELECT id,int_val,the_timestamp 
FROM lotsofdata 
WHERE the_timestamp = MAX(the_timestamp) 
AND MAX(int_val) 
LIMIT 0,1; 

我希望這會有所幫助。如果您可以提供表結構和查詢示例,我想提供幫助。我只需要一些更具體的細節。

+0

我應該說我們的DBA組嚴重限制了我們可以做的事情並且不支持視圖。帶有示例結構和查詢的編輯帖子。 – methodin 2010-09-27 20:09:18

0

我知道你已經接受了觀點的答案,我知道你提到你仍然堅持在5.0 ...但我仍然認爲值得提及分區,這從我收集的,將解決所有你的問題。
刪除舊數據就像刪除一個單獨的表一樣簡單...並且比執行「從huge_table刪除時間戳< x」
無限快,並且如果確保查詢正確地修剪分區,也快。

事實上,我升級到5.1,因爲我有一個非常相似的情況,並認爲分區是唯一真正的解決方案。