高性能mysql實戰 筆記(一)

模擬電商數據庫設計及架構優化實戰(只設計數據庫設計,不包括前後端)

項目說明(模擬電商項目):

數據庫設計規範的指定: 

 

數據庫命名規範:

一  所有數據庫對象名稱必須使用小寫字母並用下劃線分割

二  所有數據庫對象名稱禁止使用mysql保留關鍵字(如表名爲from)

三  數據庫對象的命名要見名識義,並且最好不要超過32個字符

例: 用戶數據庫表 mc_userdb  用戶賬號表: user_account

四  臨時表必須以tmp_爲前綴並以日期爲後綴(便於清理) 備份庫,備份表必須以bak_爲前綴日期爲後綴

五  所有存儲相同數據的列名和列類型必須一致

 

數據庫基本設計規範:

一  所有表必須使用Innodb存儲引擎(如果不是,儘快統一)

原因:5.6以後的默認引擎,支持事務,行級鎖,更好的恢復性,高併發下性能更好

二  數據庫和表的字符集統一使用UTF8(表的字符集統一可以防止亂碼)

三  所有的表和字段都要添加註釋   使用comment 從句添加表和列的備註,(目的:維護數據字典)

四  儘量控制單表數據量的大小,建議控制在500萬以內

五  謹慎使用mysql分區表

六  儘量做到冷熱數據分離,減小表的寬度

七  禁止在表中建立預留字段

八  禁止在數據庫中存儲圖片,文件等二進制數據(應該存路徑)

九 禁止在線上做數據庫壓力測試(應該在壓力測試環境下測試)

十  禁止從開發環境,測試環境直接連生產環境

 

數據庫索引設計規範

索引對數據庫的查詢性能來說是非常重要的  ,不要濫用索引

一 限制每張表上的索引數量,建議單張表索引不超過5個(索引不是越多越好,禁止給表中的每一列都建立單獨的索引)

二 每個Innodb表必須有一個主鍵,建議:不使用更新頻繁的列作爲主鍵,不使用多列主鍵,不使用UUID,MD5,HASH,字符串列作爲主鍵,主鍵建議選擇使用自增id值

三 常見索引列建議:

select,update,delete語句的where從句中的列

包含在order by,group by,distinct中的字段

四 如何選擇索引多個列的順序:

區分度最高的列放在聯合索引的最左側,

儘量把字段長度小的列放在聯合索引的最左側

使用最頻繁的列放到聯合索引的左側

五 避免建立冗餘索引和重複索引

六 對於頻繁的查詢優先考慮使用覆蓋索引

七  儘量避免使用外鍵約束

 

數據庫字段設計規範:

一  優先選擇符合存儲需要的最小的數據類型:

將字符串轉化爲數字類型存儲 INET_ATON('255.255.255.255') = 4294967295

二  優先選擇符合存儲需要的最小的數據類型:

1  對於非負數據採用無符號整形進行存儲

2  varchar(N) N 代表的是字符數 不是字節數

3  使用utf8存儲漢字varchar(255) = 765個字節

4  過大的長度會消耗更多的內存

三  避免使用TEXT,BLOB數據類型:

建議把BLOB或是TEXT列分離到單獨的擴展表中

TEXT或BLOB類型只能使用前綴索引

四  避免使用ENUM數據類型:

修改ENUM值需要使用alter語句

ENUM類型的order by操作效率低,需要額外的操作

禁止使用數值作爲ENUM的枚舉值

五  儘可能把所有列定用爲NOT NULL:

索引null列需要額外的空間來保存,所以要佔用更多的空間

進行比較和計算時要對null值比較

六 使用TIMESTAMP或DATETIME類型存儲時間  需要的字節更少

七  同財務相關的金額類數據,必須使用decimal類型,不丟失精度

 

數據庫SQL開發規範

一 建議使用預編譯語句進行數據庫操作 (prepare)

二 避免數據類型的隱式轉換:

隱式轉換會導致索引失效  select * from test where id = '111'

三  充分利用表上已經存在的索引:

避免使用雙%號的查詢條件  a like %123%

一個SQL只能利用到符合索引中的一列進行範圍查詢

使用left join 或 not exists 來優化not in 操作

四  程序連接不同的數據庫使用不同的賬號,禁止跨庫查詢:

爲數據庫遷移和分庫分表流出餘地

降低業務耦合

五  禁止使用select * 必須使用select + 字段 查詢:

消耗更多cpu和io以及網絡帶寬資源

無法使用覆蓋索引

可減少表結構變更帶來的影響

六 禁止使用不含字段列表的insert語句:

例:insert into t values ('a','b','c')  

七  避免使用子查詢,可以把子查詢優化爲join操作:

子查詢的結果集無法使用索引

子查詢會產生臨時表操作,數據量大會嚴重影響效率

消耗過多的cpu和io操作

八  避免使用join關聯太多的表:

每join一個表會多佔用一部分內存

會產生臨時表的操作,影響查詢效率

mysql最多允許關聯61個表,建議不超過5個

九  減少同數據庫的交互次數:

數據庫更適合處理批量操作

合併多個相同的操作到一起,可以提高處理效率

十  使用in 代替 or :

in 的值不要超過500個

in 操作可以有效的利用索引

十一  禁止使用order by rand() 進行隨機排序

會把表中所有符合條件的數據裝載到內存中進行排序

會消耗大量的cpu和io及內存資源

推薦在程序中獲取一個隨機值,然後從數據庫中獲取數據的方式

十二 where從句中禁止對列進行函數轉換和計算

對列進行函數轉換或計算會導致無法使用索引

十三 在明顯不會有重複值時使用union all 而不是union 

union會把所有數據放到臨時表中後再進行去重操作

union all 不會再對結果集進行去重操作

十四 拆分複雜的大sql爲多個小sql

 

未完待續。。。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章