天天看點

MYSQL資料庫設計的一點總結

點選這裡使用RSS訂閱本Blog: rel="alternate" href="http://feed.feedsky.com/softwave" target="_blank" rel="external nofollow" type="application/rss+xml" title="RSS 2.0" /> <script language="javascript"> </script> <script language="javascript" src="http://www.feedsky.com/jsout/publishlist_v2.js?burl=softwave&out_html=true"></script>

大大小小也搞過一些資料庫設計,見過一些其他人的設計,看過些書,總結總結,經驗談。

摘自【http://blog.80s.net.cn/?p=473】

選表類型:

大家都知道mysql的myisam表适合讀操作大,寫操作少;表級鎖表

innodb表正好相反;行級鎖表

網際網路服務,不算支付性的服務外,互動産品,新聞系統等等一般都是讀多,寫少。用myisam表比較合适。

表的設計

定長表:所有列的字段長度都是定長的。可以去查mysql的手冊不定長字段是VARCHAR、BLOB或TEXT。int char都是定長的,定長表占用空間會大。

動态表:就是字段不是都定長的。

定長表要比動态表檢索速度快。

軟體系統的設計習慣是把每張表都厘清很明确的功能,比如使用者表都是使用者資訊,如果需要同時從留言表取資料,又從使用者表取使用者資訊的時候,就會采用聯 合查 詢,有的時候一些操作還會用left,join等各種複雜sql語句,沒準還要用mysql的函數。如果是針對通路量,讀取量很大的網際網路服務時,同時并 發去讀,資料量又大,很可怕。最好是如果資料不會修改,在常用的表上有備援字段,能夠做到一次讀,把資料都拿到;可以有備援的寫操作,但減少複雜的查詢操 作。

在設計表的時候要将這個表的所有字段類型占用的位元組數求和,并乘以你的預期(如:存儲100W資料量),就是整張表未來會占用容量。由于在 Linux上 ext2,windows的fat32最大支援檔案容量是2G(其他核心及檔案系統是否還有不支援超過2G的 沒研究過,windows的ntfs支援超過2G),如果你的表未來容量超過2G,那肯定是不行的,要不在接近數量級的時候拆表,要不就提前規劃提前拆 表。具體每個字段的占用大小可以去看mysql的手冊。

拆表 拆庫

拆表就是将一張表複制N多張,裡面分别存放不用内容的資料,資料的存放是用HASH算法來決定放入哪張表。

例如使用者表user,傳統情況就是一張表,拆表就是将表複制為user_01,user_02等裡面都存放了格式一樣的不同使用者資料。

拆庫和拆表類似,就是庫的複制。

拆表或拆庫有很多的HASH算法,主要目的就是減少表的資料量,用算法保證每個表的資料量平均,請求,讀寫操作被分攤降低壓力,而且安全,出了問題最多是一部分使用者受影響。缺點就是檢索不友善,需要另想辦法。

很多網站為了前期省事都會采用discuz的産品,如bbs,blog等,網上有不少關于這個産品的介紹和優化方法,沒細研究過,聽過一些網站介紹 他們的 優化方法時,對于資料庫主要是采用主從的方法,将資料庫的讀寫分離來提高性能,但是個人覺得這種辦法在資料量到了規模的時候就OVER了,并發和讀寫操作 沒提升,資料也是會逐漸累計超過限制。

網際網路服務由于要應對大資料量,大請求量,是以在設計開發的時候就不要太學院派,不要力圖達到資料庫、程式的設計“優美”,性能是最要緊的。

<script type="text/javascript" src="http://www.google.com/reader/ui/publisher.js"></script> <script type="text/javascript" src="http://www.google.com/reader/public/javascript/user/00697638153916680411/state/com.google/broadcast?n=5&callback=GRC_p(%7Bc%3A%22green%22%2Ct%3A%22%5Cu8FD9%5Cu4E9B%5Cu6587%5Cu7AE0%5Cu4E5F%5Cu503C%5Cu5F97%5Cu4E00%5Cu770B%22%2Cs%3A%22false%22%7D)%3Bnew%20GRC"></script>