規範
庫名、表名、字段名必須使用小寫字母, 並採用下劃線分割, 禁止超過32個字符(整齊、易讀)
臨時庫、表名須以tmp加日期爲後綴;
使用Innodb存儲引擎.【好處: 支持事務和行級鎖】
字符集統一使用UTF8mb4【most bytes 4《支持Emoji和全部中文】;
表,字段增加註釋,方便後期維護,枚舉型標明說明文字.
控制單表字段數量,建議冷熱數據分離,大字段分離,提升IO性能;
統一常用字段的含義與使用,比如很多表都會出現創建時間、更新時間、刪除時間、軟刪除字段、狀態等等,團隊內約定好對應的字段、類型、默認值等等。
不使用視圖、外鍵,而是通過代碼多次實現 【視圖/外鍵需要修改地方衆多,可讀性可遷移性較差】
單表數據量控制在5000w以內,超出要分庫分表;
字段選擇:
- 字符串: 優先使用varchar,如果長度基本固定的列,如果該列恰好更新又特別頻繁,適合char,大文本使用text;
- 數字: 使用tinyint(1)來代替 enum和boolean
- 時間: 推薦使用datetime;
- datetime 和timestamp類型所佔的存儲空間不同,前者8個字節,後者4個字節,timestamp只能到2038-01-19 11:14:07;
- timestamp類型隨時間不同而不同.
索引:
- 個數: 索引個數控制在
5
個以內, 索引在加快訪問速度的同時,會增加維護負擔,增大IO壓力,索引佔用空間是成倍增加的 - 主鍵索引: 一般情況下優先考慮UUID,【考慮UUID和自增id的應用場景】
- 在使用前使用
explain
看能否命中索引; - 組合索引要遵循最左原則: 例如index(‘c1’, ‘c2’, ‘c3’) where ‘c2’ = ‘aaa’ 不使用索引,where
c2
= aaa
and c3
=sss
不能使用索引(如果第一個字段出現 範圍符號的查找,那麼將不會用到索引,如果是第二個或者第三個字段使用範圍符號的查找,那麼他會利用索引,利用的索引) https://www.cnblogs.com/chenshishuo/p/5030029.html - 索引字段必須使用 NOT NULL + 默認值的形式,其他的不加NOT NULL對於性能提升影響不大;
SQL語句
- 杜絕直接 SELECT * 讀取全部字段,列出要讀取的字段;
- 使用where,limit,offset等字段標明範圍,儘量避免全表搜索;
- 使用like模糊匹配,%儘量不要放首位,會導致搜索失效;
庫名、表名、字段名必須使用小寫字母, 並採用下劃線分割, 禁止超過32個字符(整齊、易讀)
臨時庫、表名須以tmp加日期爲後綴;
使用Innodb存儲引擎.【好處: 支持事務和行級鎖】
字符集統一使用UTF8mb4【most bytes 4《支持Emoji和全部中文】;
表,字段增加註釋,方便後期維護,枚舉型標明說明文字.
控制單表字段數量,建議冷熱數據分離,大字段分離,提升IO性能;
統一常用字段的含義與使用,比如很多表都會出現創建時間、更新時間、刪除時間、軟刪除字段、狀態等等,團隊內約定好對應的字段、類型、默認值等等。
不使用視圖、外鍵,而是通過代碼多次實現 【視圖/外鍵需要修改地方衆多,可讀性可遷移性較差】
單表數據量控制在5000w以內,超出要分庫分表;
字段選擇:
- 字符串: 優先使用varchar,如果長度基本固定的列,如果該列恰好更新又特別頻繁,適合char,大文本使用text;
- 數字: 使用tinyint(1)來代替 enum和boolean
- 時間: 推薦使用datetime;
- datetime 和timestamp類型所佔的存儲空間不同,前者8個字節,後者4個字節,timestamp只能到2038-01-19 11:14:07;
- timestamp類型隨時間不同而不同.
索引:
- 個數: 索引個數控制在
5
個以內, 索引在加快訪問速度的同時,會增加維護負擔,增大IO壓力,索引佔用空間是成倍增加的 - 主鍵索引: 一般情況下優先考慮UUID,【考慮UUID和自增id的應用場景】
- 在使用前使用
explain
看能否命中索引; - 組合索引要遵循最左原則: 例如index(‘c1’, ‘c2’, ‘c3’) where ‘c2’ = ‘aaa’ 不使用索引,where
c2
=aaa
andc3
=sss
不能使用索引(如果第一個字段出現 範圍符號的查找,那麼將不會用到索引,如果是第二個或者第三個字段使用範圍符號的查找,那麼他會利用索引,利用的索引) https://www.cnblogs.com/chenshishuo/p/5030029.html - 索引字段必須使用 NOT NULL + 默認值的形式,其他的不加NOT NULL對於性能提升影響不大;
- 個數: 索引個數控制在
SQL語句
- 杜絕直接 SELECT * 讀取全部字段,列出要讀取的字段;
- 使用where,limit,offset等字段標明範圍,儘量避免全表搜索;
- 使用like模糊匹配,%儘量不要放首位,會導致搜索失效;
優化
- 大數據量獲取全部儘量採用並行分批的方案去做;
- 分頁優化: 儘量使用where條件 + limit 替換 offset + limit,
- SQL語句中IN包含的值不應超過200個,如果過多則分批;
- 讀寫分離;
- 爲搜索字段建索引;
- 避免select *, 列出要讀取的字段;
擴展