數(shù)據(jù)庫(kù)表設(shè)計(jì)這塊學(xué)問比較多,我這里單從互聯(lián)網(wǎng)角度出發(fā)同時(shí)結(jié)合Innodb的特性給出一些設(shè)計(jì)方法供大家參考。本文構(gòu)建大概分兩分部分:Innodb的特性及設(shè)計(jì)中如何利用這種特性。 Innodb特性: Innodb是索引聚集表, 存儲(chǔ)結(jié)構(gòu)是BTREE Innodb的表的數(shù)據(jù)存儲(chǔ)是有順
數(shù)據(jù)庫(kù)表設(shè)計(jì)這塊學(xué)問比較多,我這里單從互聯(lián)網(wǎng)角度出發(fā)同時(shí)結(jié)合Innodb的特性給出一些設(shè)計(jì)方法供大家參考。本文構(gòu)建大概分兩分部分:Innodb的特性及設(shè)計(jì)中如何利用這種特性。
Innodb特性:
Innodb是索引聚集表, 存儲(chǔ)結(jié)構(gòu)是BTREE
Innodb的表的數(shù)據(jù)存儲(chǔ)是有順序的,默認(rèn)是以主建排序,主建即是數(shù)據(jù)本身,不單獨(dú)存放。
如果沒有主建,Innodb以第一個(gè)唯一索引排序,如果連唯一索引也沒,Innodb內(nèi)部會(huì)產(chǎn)生一個(gè)6字節(jié)的字段排序(這個(gè)也是性能殺手,所以對(duì)這塊如果不想花太多時(shí)間去想這個(gè)事,就添加一個(gè)自增的列無業(yè)務(wù)意義做為主建即可)
Innodb表普通索引存儲(chǔ)需要包含主建(或是Innodb表聚集的字段)
如何利用這些特性:
對(duì)于Insert操作要求比高的表: 建議增加一個(gè)自增的列做主建,這樣減少數(shù)據(jù)的寫入造成Innodb表在存儲(chǔ)上不斷的拆葉排序的操作。 通過添加一個(gè)自增的列做主建從而達(dá)到Innodb表的寫入都是順序IO的形態(tài)。所以這種情況,保證在1W/S左右的Insert也是比較容易的。添加一個(gè)主建還有另外一個(gè)好處,真正的條件將會(huì)成為唯一索引或是普通索引, 這樣索引單獨(dú)存放起來后,整體上比原來的表文件會(huì)小很多,這樣基于條件的查詢,可以從一個(gè)較少的文件快速定位到需要的行。這樣也有機(jī)會(huì)利用到索引覆蓋。
另一種場(chǎng)景,寫入少,同時(shí)每次讀多(讀取不是一條記錄),這種場(chǎng)景可以考慮不要使用自增的列做為主建,就使用查詢條件或是查詢條和其它通達(dá)到唯一,定義為主建。這樣查詢就可以一次讀到數(shù)據(jù)。還一種場(chǎng)景如存好友關(guān)系,或是股票信息,特別好友關(guān)系表類的數(shù)據(jù),可以考慮使用兩個(gè)用戶的Id做聯(lián)合主建,查詢時(shí)條件中只用自已的Id讀所有用戶的數(shù)據(jù),這樣就是一個(gè)順序IO的請(qǐng)求。同樣這種情景下對(duì)一些數(shù)據(jù)就可以考慮冗余,減少請(qǐng)求反向的數(shù)據(jù)操作。
更新最好基于主建或是唯一索引來做,這樣才能有機(jī)會(huì)利用Innodb的行級(jí)鎖。
互聯(lián)網(wǎng)中還有一種觀點(diǎn)是:頁面展現(xiàn)什么,就存成什么樣的表。這種在CMS中還能適用,在WEB2.0及相關(guān)的應(yīng)用這種觀念就行不通。但可以考慮適當(dāng)?shù)亩嗵帉懀瑢?shí)現(xiàn)數(shù)據(jù)的快速讀取及索引表的引入。
從業(yè)務(wù)形態(tài)上來看:
建議數(shù)據(jù)在設(shè)計(jì)階段就要考慮那些是大表,可以分為多少個(gè)業(yè)務(wù),怎么能核心功能拆分。這塊舉個(gè)例子:大家經(jīng)常聽到的淘寶的用戶庫(kù),商品庫(kù),收藏夾庫(kù),交易庫(kù),評(píng)論庫(kù)等。及其它我們經(jīng)常也能聽到的:認(rèn)證庫(kù),好友關(guān)系庫(kù)等等。到業(yè)務(wù)形態(tài)上后,可以根據(jù)不同的形態(tài)選擇不同的軟件來做不要只看到mysql了,這塊的設(shè)計(jì)可以把nosql類的東西也要考慮進(jìn)來,最終設(shè)計(jì)數(shù)據(jù)庫(kù)的模型。
原文地址:Innodb IO優(yōu)化 — 數(shù)據(jù)庫(kù)表設(shè)計(jì), 感謝原作者分享。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com