這篇文章來自於看部落格園一個園友的分享經歷,原文:http://www.cnblogs.com/qqloving/p/3427138.html
他不清楚mysql一個庫裡面分多少張表合適,他一個庫分了8000張表。於是我看了,忍不住作答。
於是以個人隨筆的形式給自己做知識備忘吧。
1、單表體積多大的時候需要分表
曾經看過一個部落格,分析到什麼情況下需要分表。
單表形式訪問(也就是對這個表的訪問不涉及到join聯合查詢):單個表的體積大於2g的時候。或者說,單個表的行數達到一千萬的時候。
兩表jion:表的體積大於2G或行數大於500W。
在趕集網石展提到的分享中,純int行不能超過1000萬行,含char型別的欄位不能超過500萬行。與曾經看過文章提到的1000萬和500萬很相似。難道這是一個瓶頸值嗎?
2、單個庫控制多少張表為妥
聽過趕集網的一個dba的分享視訊。他從中提到,mysql的單庫表數量不要超過300-400張表。這個我也沒試過。不過我想應該是他經驗之談吧。
為什麼一個庫不能很多張表。我的理解是,mysql一個資料庫就是磁碟上一個資料夾。那麼裡面一張表就需要一個檔案記錄(像myisam型別的是需要三個檔案分別記錄表結構,記錄索引、記錄表資料)。
分8000張表,假設是myisam,則需要8000*3個檔案。
作業系統對一個目錄有檔案數限制,當檔案數量太多的時候,查詢檔案的速度就會慢,所以我們經常見到的上傳的圖片不會全部放到一個資料夾,一般是按照年月日來生成資料夾。
當然,網友提到表的是innodb型別。
innodb型別有兩種方式儲存資料:共享表和獨享表
獨享,Innodb_file_per_table,每個表的資料都對應儲存在一個檔案中
共享,一個庫下面所有的innodb型別表資料都儲存在一個檔案中。
mysql資料全部放到一個檔案中去了,當資料量超過一定額度,又會新生成一個資料檔案來儲存。