模擬電商資料庫設計及架構優化實戰(只設計資料庫設計,不包括前後端)
專案說明(模擬電商專案):
一 所有資料庫物件名稱必須使用小寫字母並用下劃線分割
二 所有資料庫物件名稱禁止使用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型別,不丟失精度
一 建議使用預編譯語句進行資料庫操作 (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
未完待續。。。
高效能mysql(一) 建立高效能索引
單列索引和多列索引 單列索引 多個單列索引的選擇問題 多個or條件 多個單列的效能往往效能很低,盡量建立高效的多列索引。多列索引 選擇合適的索引順序 避免範圍條件 在where子句中,in是有效的,範圍條件會導致後面的索引無效!在order by中,範圍條件和in都會導致無法按照索引排序!按照索引順...
高效能MySQL學習筆記一 MySQL架構
mysql最與眾不同的特性是 它的儲存引擎架構,這種架構的設計將查詢處理以及其他系統任務和資料的儲存 提取相分離。這種處理和儲存相分離的設計可以在使用時根據效能 特性,以及其他需求來選擇資料儲存的方式。mysql預設採用自動提交模式。設定是否自動提交 1為自動提交,0禁用,禁用後,使用commit或...
建立高效能索引 《高效能Mysql》筆記2
crate table people last name varchar 50 not null,first name varchar 50 not null,dob date not null,gender enum m f not null,key last name,first name,do...