2009-08-08 61 views
2

下面是我的朋友表,
我包括2個條目以顯示它是如何工作的,當用戶添加一個人作爲朋友時,它將2個條目插入到具有此代碼的數據庫中;如何將一個mysql表分成多個表並查詢正確的區域?

<?PHP 

//status 0=approved 1=declined approval 3=pending approval 
$sql = "insert into friend_friend (userid,friendid,status,submit_date) 
    values 
    ('$_SESSION[auto_id]','$friendid','0',now()), 
    ('$friendid','$_SESSION[auto_id]','3',now())"; //Line above is my user ID, the other users ID, status 0 for approved on my side, date 
                //next entry is the receiving users entry, there ID, my ID, 3 for not approved yet, date 
executeQuery($sql); 

//So that code above is my php that adds a friend 

//Below is my table scheme for the friends table 
CREATE TABLE IF NOT EXISTS `friend_friend` (
    `autoid` int(11) NOT NULL AUTO_INCREMENT, 
    `userid` int(10) DEFAULT NULL, 
    `friendid` int(10) DEFAULT NULL, 
    `status` enum('1','0','3') NOT NULL DEFAULT '0', 
    `submit_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `alert_message` enum('yes','no') NOT NULL DEFAULT 'yes', 
    PRIMARY KEY (`autoid`), 
    KEY `userid` (`userid`), 
    KEY `friendid` (`friendid`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1756421 ; 

-- 
-- Dumping data for table `friend_friend` 
-- 
INSERT INTO `friend_friend` (`autoid`, `userid`, `friendid`, `status`, `submit_date`, `alert_message`) VALUES 
(637229, 2, 1, '1', '2007-10-18 01:02:00', 'no'); 
INSERT INTO `friend_friend` (`autoid`, `userid`, `friendid`, `status`, `submit_date`, `alert_message`) VALUES 
(637230, 1, 2, '1', '2007-10-18 01:02:00', 'no'); 

INSERT INTO `friend_friend` (`autoid`, `userid`, `friendid`, `status`, `submit_date`, `alert_message`) VALUES 
(637231, 22901, 1, '1', '2007-10-18 02:24:05', 'no'); 
INSERT INTO `friend_friend` (`autoid`, `userid`, `friendid`, `status`, `submit_date`, `alert_message`) VALUES 
(637232, 1, 22901, '1', '2007-10-18 02:24:05', 'no'); 
?> 

我所想要做的是最多分裂friend_friend表爲根據用戶ID號碼的多個表
像1-20,000之間的所有用戶ID的去一個表,所有用戶ID 20,001-40,000,40,001- 60000都去不同的表

我不知道如何做到這一點最好的,我需要檢測添加了新的朋友,當以及用戶
我假設的檢索時,朋友列表中的用戶應查詢該表在我的代碼頂部,添加用戶的2個條目將不得不被分成2個查詢並更新不同的表格?

+0

爲什麼你想分裂用戶ID的? – Milhous 2009-08-08 03:06:44

+0

由於這個表格變大了,我認爲在一個較小的表上運行查詢會更好,它在一年內已​​經有1,700,000行,這個表的數量可能是幾百萬行,它是我網站上訪問量最大的表,通常每天都會有數以千計的查詢與之對抗,並且@當交通繁忙時 – JasonDavis 2009-08-08 06:11:30

+0

嗨Jasondavis,您是否找到適合您的問題的正確解決方案?分區或分片之後,最佳方法是什麼?現在你的桌子尺寸是多少?感謝您對此的幫助?這是你的問題的評論在http://stackoverflow.com/questions/1247841 – Bujji 2012-05-21 18:35:26

回答

0

藝術的術語是「分片」(以幫助您在文獻檢索,網絡搜索等) - 或者至少,一個流行的名詞藝術(詞彙不幸在這個領域沒有完全解決)。一旦你做了研究,你會發現伴隨的問題是不得不查詢所有碎片(和UNION ALL,通常是 - 或者有時以不同的方式將它們聚合),當你不知道在哪裏(部分或全部)答案可能是。

因此,分片(特別是「水平分片」,這就是你在這裏所做的)應該以特定於應用的方式進行建議,嘗試對「合在一起」的條目進行分組,以便儘可能檢查一個分片就足夠了。垂直分片(在不同的表中放置不同的列,而不是行)更容易設計,因爲您只需檢查最頻繁的查詢,以確保其中幾個(理想情況下只有一個)分片完全滿足它們。

哦,當然,如此巨大數量的微妙的高級工作在證明是需要的之前是不值得的 - 然後,它將確保數據庫後端的工作被分割服務器,因爲單個服務器無法再削減它。你似乎只是試圖學習分片的基本原理(如果我正在讀這個錯誤,我很抱歉) - 而且問題的一部分 - 就像系統架構中其他重要的部分一樣 - 是沒有真正的動機,直到系統大小超過合理的「玩具應用程序」... - -