1,數(shù)據(jù)庫范式
1.1 第一到第三范式
第一范式 1NF. 保證列的原子性, 一列不能再被分為多個列.
第二范式 2NF. 每行必須可以被唯一地區(qū)分. 通常通過加(id)列來實現(xiàn).
沒有包含在主鍵中的列必須完全依賴于主鍵, 而不能只依賴于主鍵的一部分
若有以上情況, 則需要進行表拆分.
第三范式 3NF. 非主鍵列必須直接依賴于主鍵, 不能存在遞歸依賴.
1.2 遵從范式設(shè)計的優(yōu)劣
范式可以避免數(shù)據(jù)冗余,減少數(shù)據(jù)庫空間,減輕維護數(shù)據(jù)完整性的麻煩.
范式化的更新操作比反范式更快.
范式的問題是范式的等級越高, 設(shè)計出來的表越多, 從而造成操作性能越來越低.
1.3 反范式
反范式允許適當(dāng)?shù)娜哂?
用空間換時間. 把數(shù)據(jù)冗余在多個表中.
減少查詢時的表關(guān)聯(lián).
單獨的表也能使用更有效的索引策略.
2 緩存表和匯總表
2.1 保存冗余數(shù)據(jù)
提升性能最好的辦法是在同一張表中保存衍生的冗余數(shù)據(jù).
也可以創(chuàng)建完全獨立的緩存和匯總表.
可選擇使用實時維護或定期重建, 這依賴于具體的應(yīng)用程序.
定期重建會節(jié)省資源, 保持表不會有太多碎片, 以及完全順序組織的(高效)索引.
重建時, 使用"影子表(重命名)"來保證數(shù)據(jù)在重建過程中的可用性.
mysql> drop table if exists sample_new, sample_old;
mysql> create table sample_new like sample;
-- 對sample_new表進行需要的修改.
mysql> rename table sample to sample_old, sample_new to sample.
2.2 物化視圖
物化視圖?是預(yù)先計算并存儲在磁盤上的表, 可通過各種策略刷新和更新.
通過提取對源表的更改, 增量地重新計算物化視圖的內(nèi)容. 而不需要通過查詢原始數(shù)據(jù)來更新視圖.
優(yōu)勢: 計算增量比從源讀取效率高.
2.3 計數(shù)器表
要想獲得更高的并發(fā)更新性能. 可以將計數(shù)器保存在多行中.
預(yù)先在表中增加N(如100) 行數(shù)據(jù).
每次隨機選擇一行進行更新.
set cnt = cnt+1 where slot = RAND() *100.
獲取結(jié)果時進行SUM(cnt).
若要每隔一段時間(天)開始一個新的計數(shù)器.
primary key(day,slot).
不用預(yù)先生成行, 使用 Insert .. ON Duplicate Key Update cnt = cnt +1.
避免表過大
執(zhí)行一個周期性的任務(wù), 合并結(jié)果到0 slot, 同時刪除其它的slot.
所有高性能設(shè)計的初衷: 更快地讀, 更慢地寫.
2.4 加快Alter Table操作的速度
Alter Table
過程:
從新的結(jié)構(gòu)創(chuàng)建一個空表.
將舊表所有數(shù)據(jù)插入新表.
刪除舊表.
問題:
耗時, 尤其是當(dāng)內(nèi)存不足而表又過大時.
大部分Alter Table操作將導(dǎo)致MySql服務(wù)中斷.
優(yōu)化Alter Table的方式
方式1: 在一臺不提供服務(wù)的機器上執(zhí)行alter table.然后和提供服務(wù)的機器進行切換.
方式2: 影子拷貝. 創(chuàng)建與原本無關(guān)的新表, 通過重命名和刪除表來交換兩種表.
方式3: 為想要的新結(jié)構(gòu)創(chuàng)建新的.frm文件,然后用它替換掉已有的.
修改/刪除列的默認(rèn)值.
使用modify column 命令會重建表,
而alter column 只是修改了.frm文件.
并不是所有的alter table都會引起表重建, 不需要重建表的操作有:
移除列的Auto_Increment屬性.
增加/移除/更改Enum和Set常量.
快速創(chuàng)建MyISAM 索引.
為了高效地載入數(shù)據(jù)到MyISAM表中,可以使用以下方式.
先禁用索引(Disable Keys), 載入數(shù)據(jù), 然后重新啟用索引(Enable Keys).
在數(shù)據(jù)加載完畢后, 可通過排序構(gòu)建索引.
這種方式對唯一索引無效. 這會導(dǎo)致在內(nèi)存中構(gòu)造唯一索引, 并為載入的每一行檢查唯一性.
最后編輯于 :2017.11.27 04:13:56
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者