資料庫和表的字符集統一用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為字首日期為字尾 所有儲存相同資料的列明和列型別必須...