日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL使用规范_心得总结

發布時間:2023/12/3 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL使用规范_心得总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 命名規范
  • 數據庫基本設計規范
  • 數據庫字段設計規范
  • 索引設計規范
  • 常見索引列建議
  • 數據庫開發規范
  • 數據庫操作行為規范

命名規范

1.所有數據庫對象名稱必須使用小寫字母并用下劃線分割
2.禁止使用 MySQL 保留關鍵字,如果表名中包含關鍵字查詢時,需要使用單引號括起來
3.見名識意
4.名稱不要超過 32 個字符
5.臨時庫表以 tmp_ 為前綴并以日期為后綴,備份表以 bak_ 為前綴并以日期為后綴
6.所有存儲相同數據的列名和列類型必須一致,一般作為關聯列,如果查詢時關聯列類型不一致會自動進行數據類型隱式轉換,會造成列上的索引失效,導致查詢效率降低
7.列名不要帶上表名,例如,student 表中的列 id,name 等,不要命名成 student_id,student_name

數據庫基本設計規范

1.沒有特殊要求下,所有表必須使用 innodb 存儲引擎
支付事務、行級鎖、更好的恢復性、高并發下性能更好

2.數據庫和表的字符集統一使用 utf8
統一字符集可以避免由于字符集轉換產生的亂碼,不同的字符集進行比較前需要進行轉換會造成索引失效

3.所有表和字段都需要添加注釋
使用 comment 從句添加表和列的備注進行數據字典的維護

4.盡量控制單表數據量的大小,建議控制在500萬以內
過大的數據量,在修改表結構、備份、恢復都會有很大的問題。

5.謹慎使用分區表
分區表在物理上表現為多個文件,在邏輯上表現為一個表,跨分區查詢效率可能更低,建議采用物理分表的方式管理大數據

6.盡量做到冷熱數據分離,減小表的寬度
MySQL 限制每個表最多存儲4096列,并且每一行數據在大小不能超過65535字節

7.減少磁盤IO
保證熱數據的內存緩存命中率,避免讀入無用的冷數,經常一起使用的列放到一個表中避免更多的關聯操作。

8.禁止在表中建立預留字段
無法確認存儲的數據類型,對預留字段類型的修改會對表進行鎖定

9.禁止在數據庫中存儲圖片,文件等大的二進制數據
IO操作耗時,通常存儲于文件服務器,數據庫只存儲文件地址信息

10.禁止在線上做數據庫壓力測試

11.禁止從開發環境、測試環境直接連接生產環境數據庫

數據庫字段設計規范

1.優先選擇符合存儲需要的最小的數據類型
字段大,建立索引空間大,IO次數多,索引性能差

2.將字符串轉換成數字類型存儲
例如,IP地址在插入數據前先用 inet_aton() 函數把 IP 地址轉為整型,節省空間,顯示數據時使用 inet_ntoa() 函數把二進制整數轉成 IP 地址字符串顯示即可。

3.對于非負的整數,建議使用無符號整數類型存儲
例如,自增 ID,要優先使用無符號整型來存儲,無符號相對于有符號可以多出一倍的存儲空間

SIGNED INT:-2147483648~2147483647 UNSIGNED INT:0~4294967295

4.VARCHAR(N) 中的 N 代表的是字符數,而不是字節數
使用 UTF8 存儲 255 個漢字 varchar(255)=765 個字節。過大的長度會消耗更多的內存,避免使用 text、blob 數據類型,最常見的 text 類型可以存儲 64K 的數據,可以分離到單獨的擴展表中。
MySQL 內存臨時表不支持 text/blob 大數據類型,如果查詢中包含這樣的數據,在排序等操作時,就不能使用內存臨時表,必須使用磁盤臨時表進行,MySQL 還要進行二次查詢,會使 SQL 性能變得很差,不需要 text 類型的列的數據時不要對該列進行查詢。
text/blob 類型只能使用前綴索引,并且text列上是不能有默認值的。

5.避免使用 enum 類型
修改 enum 值需要使用alter語句;
enum 類型的order by 操作效率低,需要額外操作;
禁止使用數值作為enum的枚舉值。

6.盡可能把所有列定義為 not null
索引 null 列需要額外的空間來保存,所以要占用更多的空間;
進行比較和計算時要對 null 值做特別的處理。

7.使用 timestamp 4 個字節 或 datetime 類型 8 個字節存儲時間
TIMESTAMP 存儲的時間范圍 1970-01-01 00:00:01 ~ 2038-01-19-03:14:07;
TIMESTAMP 占用 4 字節和 INT 相同,但比 INT 可讀性高;
超出 TIMESTAMP 取值范圍的使用 DATETIME 類型存儲。

8.同財務相關的金額數據必須使用 decimal 類型

非精準浮點:float,double
精準浮點:decimal

Decimal 類型為精準浮點數,在計算時不會丟失精度。占用空間由定義的寬度決定,每 4 個字節可以存儲 9 位數字,并且小數點要占用一個字節。可用于存儲比 bigint 更大的整型數據。

索引設計規范

1.限制每張表上的索引數量,不超過 5 個,索引可以增加查詢效率,同樣也會降低插入和更新的效率,有些情況下會降低查詢效率

因為 MySQL 優化器在選擇如何優化查詢時,會根據統一信息,對每一個可以用到的索引來進行評估,以生成出一個最好的執行計劃,如果同時有很多個索引都可以用于查詢,就會增加 MySQL 優化器生成執行計劃的時間,同樣會降低查詢性能。

2.禁止給表中的每一列都建立單獨的索引

使用聯合索引查詢

每個索引組織表 innodb 必須有個主鍵–數據的存儲的邏輯順序和索引的順序是相同的,每個表都可以有多個索引,但是表的存儲順序只能有一種 innodb 是按照主鍵索引的順序來組織表的。

3.不要使用更新頻繁的列作為主鍵

4.不要使用 uuid md5 hash 字符串列作為主鍵

無法保證數據的順序增加

6.主鍵建議使用自增ID值

常見索引列建議

1.出現在 select update delete 語句的 where 從句中的列

2.包含在order by group by distinct 中的字段

3.多表join的關聯列

4.建立聯合索引效果更好

5.索引列的順序
區分度最高的放在聯合索引的最左側 ,區分度 = 列中不同值的數量 / 列的總行數
盡量把字段長度小的列放在聯合索引的左側

6.避免建立冗余索引和重復索引

重復索引示例:primary key(id)、index(id)、unique index(id)
冗余索引示例:index(a,b,c)、index(a,b)、index(a)
  
7.優先考慮覆蓋索引
就是包含了所有查詢字段(where select order by group by )的索引
避免lnnodb表進行索引的二次查詢

8.盡量避免使用外鍵約束
但要在表與表之間的關聯鍵上建立索引,外鍵建議在業務端實現參照完整性
外鍵會影響父表和子表的寫操作從而降低性能

數據庫開發規范

1.建議使用預編譯語句進行數據庫操作
減少編譯所需要的時間;
還可以解決動態 sql 所帶來的 sql 注入問題;
只傳參數,比傳遞 sql 語句更高效,相同語句可以一次解析,多次使用,提高處理效率。

2.避免數據類型的隱式轉換

3.充分利用表上已經存在的索引
避免使用雙 % 號的查詢條件

4.一個 sql 只能利用到復合索引中的一列進行范圍查詢
例如,有 a、b、c 列的聯合索引,在查詢條件中有 a 列的范圍查詢,則在 b、c 列上的索引將不會被用到,在定義聯合索引時,如果 a 列要用到范圍查找的話,就要把 a 列放到聯合索引的右側
  
5.使用 left join 或 not exists 來優化 not in 操作  
因為 not in 也通常會使用索引失效。

6.數據庫設計要充分考慮擴展性

程序連接不同的數據庫使用不同的賬號跨庫查詢
為數據庫遷移和分庫分表留出余地
降低業務耦合度

7.禁止使用 select *,應該使用 select column1, column2,... 查詢

8.禁止使用不含字段的 insert into 語句

9.避免使用子查詢,可以把子查詢優化為 join 操作
子查詢結果無法使用索引,通常子查詢的結果集會被存儲到臨時表中,不論是內存臨時表還是磁盤臨時表都不會存在索引。

10.避免使用 JOIN 關聯太多的表
關聯緩存大小可以由 join_buffer_size 參數進行設置,最多允許關聯 61 個表,建議不超過 5 個。

11.減少同數據庫的交互次數

批量執行腳本語句,可以提高處理效率

12.對列的值進行 or 判斷時,使用 in 代替 or

可以更有效的利用索引,or 很少能利用到索引;
in 的值不要超過 500 個。

13.禁止使用 order by rand() 進行隨機排序

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

因為無法使用索引

15.在明顯不會有重復值時使用 union all 而不是 union

union 會把兩個結果集的所有數據放到臨時表中后再進行去重操作,union all 不會對結果集進行去重操作

16.拆分復雜的大 SQL 為多個小 SQL

大 SQL 邏輯上比較復雜,需要占用大量 CPU 進行計算;
MySQL 一個 SQL 只能使用一個 CPU 進行計算,拆分成多個小 SQL 語句可能通過并行執行來提高處理效率

數據庫操作行為規范

1.刪除匿名賬戶,并且給 root 賬戶設置登錄密碼

剛安裝好的 MySQL 包含一個含空密碼的 root 帳戶和兩個匿名帳戶,這是很大的安全隱患,對于一些重要的應用我們應將安全性盡可能提高,所以我們要把匿名帳戶刪除,并且為 root 帳戶設置密碼,可用如下命令進行:

mysql> use mysql; mysql> delete from user where user=""; mysql> update user set password=password('newpassword') where user='root';

2.超100萬行的批量寫操作,要分批多次進行操作

大批量修改數據,一定是在一個事務中進行的,這就會造成表中大批量數據進行鎖定,從而導致大量的阻塞

3.對于大表使用 pt-online-schema-change 修改表結構

避免大表修改產生的主從延遲,避免在對表字段進行修改時進行鎖表
pt-online-schema-change 首先建立一個與原表結構相同的新表,并且在新表上進行表結構的修改,然后再把原表中的數據復制到新表中,并在原表中增加一些觸發器,把原表中新增的數據也復制到新表中,所有數據復制完成之后,把新表命名成原表,并把原表刪除掉。

4.禁止為程序使用的賬號賦予 super 權限

對于程序連接數據庫賬號,遵循權限最小原則。

在進行開發和實際應用中,用戶不應該只用 root 用戶進行連接數據庫,雖然使用 root 用戶進行測試時很方便,但會給系統帶來重大安全隱患,也不利于管理技術的提高。我們給一個應用中使用的用戶賦予最恰當的數據庫權限。如一個只進行數據插入的用戶不應賦予其刪除數據的權限。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的MySQL使用规范_心得总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。