資料庫規範

2021-09-26 10:48:25 字數 3508 閱讀 3053

資料庫和表的字符集統一用utf8 (mysql 用 utf8mb64_unicode_ci)

所有的表和字段都需要新增注釋

盡量控制單錶資料量的大小 盡量在 500w 以內

謹慎使用 mysql 分割槽表

盡量做到冷熱資料分離,減少表的寬度

禁止在表中建立預留字段

禁止在資料庫中儲存,檔案等大的二進位制資料

禁止直接從開發環境,測試環境直接連線生成環境資料庫

1、建議使用預編譯語句進行資料庫操作

預編譯語句可以重複使用這些計畫,減少sql編譯所需要的時間,還可以解決動態sql所帶來的sql注入的問題 只傳引數,比傳遞sql語句更高效 相同語句可以一次解析,多次使用,提高處理效率。

2、避免資料型別的隱式轉換

隱式轉換會導致索引失效。如:select name,phone from customer where id = 『111』;

3、充分利用表上已經存在的索引

· 避免使用雙%號的查詢條件。

如a like 『%123%』,(如果無前置%,只有後置%,是可以用到列上的索引的)

· 乙個sql只能利用到復合索引中的一列進行範圍查詢

如:有 a,b,c列的聯合索引,在查詢條件中有a列的範圍查詢,則在b,c列上的索引將不會被用到,在定義聯合索引時,如果a列要用到範圍查詢的話,就要把a列放到聯合索引的右側。

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

因為not in 也通常會使用索引失效。

4、資料庫設計時,應該要對以後擴充套件進行考慮

5、程式連線不同的資料庫使用不同的賬號,進製跨庫查詢

· 為資料庫遷移和分庫分表留出餘地

· 降低業務耦合度

· 避免許可權過大而產生的安全風險

6、禁止使用select * 必須使用select 《字段列表》 查詢

原因:· 消耗更多的cpu和io以網路頻寬資源

· 無法使用覆蓋索引

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

7、禁止使用不含字段列表的insert語句

如:insert into values (『a』,『b』,『c』);

應使用insert into t(c1,c2,c3) values (『a』,『b』,『c』);

8、避免使用子查詢,可以把子查詢優化為join操作

通常子查詢在in子句中,且子查詢中為簡單sql(不包含union、group by、order by、limit從句)時,才可以把子查詢轉化為關聯查詢進行優化。

子查詢效能差的原因:

· 子查詢的結果集無法使用索引,通常子查詢的結果集會被儲存到臨時表中,不論是記憶體臨時表還是磁碟臨時表都不會存在索引,所以查詢效能 會受到一定的影響;

· 特別是對於返回結果集比較大的子查詢,其對查詢效能的影響也就越大;

· 由於子查詢會產生大量的臨時表也沒有索引,所以會消耗過多的cpu和io資源,產生大量的慢查詢。

9、避免使用join關聯太多的表

對於mysql來說,是存在關聯快取的,快取的大小可以由join_buffer_size引數進行設定。

在mysql中,對於同乙個sql多關聯(join)乙個表,就會多分配乙個關聯快取,如果在乙個sql中關聯的表越多,所占用的記憶體也就越大。

如果程式中大量的使用了多表關聯的操作,同時join_buffer_size設定的也不合理的情況下,就容易造成伺服器記憶體溢位的情況,就會影響到伺服器資料庫效能的穩定性。

同時對於關聯操作來說,會產生臨時表操作,影響查詢效率mysql最多允許關聯61個表,建議不超過5個。

10、減少同資料庫的互動次數

資料庫更適合處理批量操作 合併多個相同的操作到一起,可以提高處理效率

11、對應同一列進行or判斷時,使用in代替or

in的值不要超過500個in操作可以更有效的利用索引,or大多數情況下很少能利用到索引。

12、禁止使用order by rand() 進行隨機排序

會把表中所有符合條件的資料裝載到記憶體中,然後在記憶體中對所有資料根據隨機生成的值進行排序,並且可能會對每一行都生成乙個隨機值,如果滿足條件的資料集非常大,就會消耗大量的cpu和io及記憶體資源。

推薦在程式中獲取乙個隨機值,然後從資料庫中獲取資料的方式

13、where從句中禁止對列進行函式轉換和計算

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

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

· union會把兩個結果集的所有資料放到臨時表中後再進行去重操作

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

15、拆分複雜的大sql為多個小sql

· 大sql:邏輯上比較複雜,需要占用大量cpu進行計算的sql

· mysql:乙個sql只能使用乙個cpu進行計算

· sql拆分後可以通過並行執行來提高處理效率

1、超100萬行的批量寫(update、delete、insert)操作,要分批多次進行操作

· 大批量操作可能會造成嚴重的主從延遲

主從環境中,大批量操作可能會造成嚴重的主從延遲,大批量的寫操作一般都需要執行一定長的時間,而只有當主庫上執行完成後,才會在其他從庫上執行,所以會造成主庫與從庫長時間的延遲情況

· binlog日誌為row格式時會產生大量的日誌

大批量寫操作會產生大量日誌,特別是對於row格式二進位制資料而言,由於在row格式中會記錄每一行資料的修改,我們一次修改的資料越多,產生的日誌量也就會越多,日誌的傳輸和恢復所需要的時間也就越長,這也是造成主從延遲的乙個原因。

· 避免產生大事務操作

大批量修改資料,一定是在乙個事務中進行的,這就會造成表中大批量資料進行鎖定,從而導致大量的阻塞,阻塞會對mysql的效能產生非常大的影響。

特別是長時間的阻塞會佔滿所有資料庫的可用連線,這會使生產環境中的其他應用無法連線到資料庫,因此一定要注意大批量寫操作要進行分批。

2、對於大表使用pt-online-schema-change修改表結構

· 避免大表修改產生的主從延遲

· 避免在對表字段進行修改時進行鎖表

對大表資料結構的修改一定要謹慎,會造成嚴重的鎖表操作,尤其是生產環境,是不能容忍的。

pt-online-schema-change它會首先建立乙個與原表結構相同的新錶,並且在新表上進行表結構的修改,然後再把原表中的資料複製到新錶中,並在原表中增加一些觸發器。

把原表中新增的資料也複製到新錶中,在行所有資料複製完成之後,把新錶命名成原表,並把原來的表刪除掉。

把原來乙個ddl操作,分解成多個小的批次進行。

3、禁止為程式使用的賬號賦予super許可權

當達到最大連線數限制時,還執行1個有super許可權的使用者連線super許可權只能留給dba處理問題的賬號使用。

4、對於程式連線資料庫賬號,遵循許可權最小原則

程式使用資料庫賬號只能在乙個db下使用,不准跨庫 程式使用的賬號原則上不准有drop許可權。

資料庫 規範

使用一致的 敘述性的名稱。靈活使用空格和縮進來增強可讀性。儲存符合iso 8601標準的日期格式 yyyy mm dd hh mm ss.sssss 最好使用標準sql函式而不是特定 商的函式以提高可移植性。保證 簡潔明瞭並消除多餘的sql 比如非必要的引號或括號,或者可以推導出的多餘where語句...

資料庫規範

db軍規30條 一 基礎規範 1 必須使用innodb儲存引擎 解讀 支援事務 行級鎖 併發效能更好 cpu及記憶體快取頁優化使得資源利 用率更高 2 必須使用utf8mb4字符集 解讀 萬國碼,無需轉碼,無亂碼風險,節省空間 3 資料表 資料字段必須加入中文注釋 解讀 n年後誰tm知道這個r1,r...

資料庫規範

所有資料庫物件名稱必須使用小寫字母並用下劃線分割 mysql嚴格區分大小寫 所有資料庫物件名稱禁止使用mysql保留關鍵字 例如from date常見關鍵字 命名要做到見名識義,最好不要超過32個字元 臨時表以tmp為字首日期為字尾 備份表以bak為字首日期為字尾 所有儲存相同資料的列明和列型別必須...