2014-01-14 71 views
-1

我與我的一位朋友發生爭執。假設我們有一個帶有userid和其他字段的db表。該表可能有很多行。同樣假設,通過設計,我們限制了表中的每個用戶ID記錄約50.My朋友建議,如果我陸續每一行對每個用戶ID之一的,查詢速度會更快如數據庫優化插入和搜索

userid otherfield 
1  ......... 
1  ......... 
.....until 50... 
2  ........ 

等。所以,當創建一個用戶ID 1時,我將50個表的行預填充爲空值...等。這個想法是,如果我知道行數並找到第一行userid = 1,我只需要看下49個瞧,我不必搜索整個表。這是正確的嗎?這可以做到沒有索引?前期人羣是一個昂貴的過程嗎?如果我只是以老式的方式插入,像

1 ........ 
2 ........ 
2 ........ 
1 ........ 

等是否有性能差異?

+0

很難理解你的建議,但從我能收集到的信息來看,這聽起來像個壞主意。不要試圖用這種過於複雜的解決方案來取代MySQL。只有痛苦會來自它。你可以顯示你的表結構和建議的查詢嗎? – JohnFx

回答

0

要回答這樣的性能問題,您應該對不同的配置運行性能測試。

但是,讓我說說幾點。

首先,儘管您可能知道給定ID的記錄彼此相鄰,但數據庫並不知道這一點。因此,如果您正在搜索一個用戶(沒有索引),則引擎需要搜索所有記錄(除非查詢中有limit子句)。其次,如果數據的長度是固定的(數字和日期),那麼在填充值爲NULL之後使用值填充值將佔用頁面上的相同空間。但是,如果數據是可變長度的,那麼給定的頁面將被填充空記錄。當您使用實際值修改記錄時,您將獲得頁面拆分。

你所要做的就是智取數據庫引擎。這不是必須的,因爲MySQL提供了索引,它提供了幾乎所有你描述的好處。

現在,說了這麼多,某些用戶的所有記錄位於同一位置的某些性能受益。如果用戶有50條記錄,那麼使用索引讀取記錄通常需要將50個頁面加載到內存中。如果記錄位於同一位置,則只需要讀取一條或兩條記錄。通常,這將是一個非常小的性能增益,因爲大多數訪問表適合內存。在某些情況下,性能增益是值得的。

+0

如果我想預先填充1000行,如果搜索時性能會有所提高;通過訪問表你的意思是,當你在一個數據庫中搜索整個表將被正確地加載到內存中? – Apostolos

+0

@Apostolos。 。 。 1000行對性能影響最小,因爲所有數據都可以很容易地放入內存中。這甚至不值得嘗試。 –