在工作中作為DBA的我們,可能也會需要面對開發人員各種 Freestyle 的要求,但是他們是否知道在運算元據庫的時候,需要注意哪些事項呢?


今兒帶著大家簡單聊聊 MySQL 資料庫的開發行為規範,十大鐵的紀律。對DBA老鐵們是一種幫助,對開發人員也是一種學習。


1. 建立的表要使用 innodb 儲存引擎表

現在基本上大部分業務都是 innodb 儲存引擎,MySQL 8.0 開始,徹底不再使用 myisam。每張表都要包含一個自增的主鍵 id。


2. 資料型別的選擇上,要秉著越簡單越好,越小越好的原則。

建議使用 int 來儲存 ipv4 的型別,可以通過函式轉換。金錢類的欄位也可以儲存為 int 型別,用分做單位就可以了。

時間型別可以採用 datetime,它比 tiemstamp 可用範圍大,儲存空間也從原來的 8 位元組,降到了 5 位元組,效能上也不錯。

mysql> select inet_aton(`192.168.56.132`);
+-----------------------------+
| inet_aton(`192.168.56.132`) |
+-----------------------------+
|          3232249988 | 
+-----------------------------+

mysql> select inet_ntoa(3232249988);
+-----------------------+
| inet_ntoa(3232249988) |
+-----------------------+
| 192.168.56.132        | 
+-----------------------+
1 row in set (0.00 sec)

3. 庫名、表名、欄位名必須使用小寫字母,採用“_“分割

MySQL 資料庫中,通過引數 lower_case_table_names 來區分表名的大小寫 預設為 0,代表大小寫敏感。如果是 1,大小寫不敏感,以小寫儲存。

4. 不建議使用 ENUM 型別,使用 TINYINT 來代替。

也不建議使用大資料型別的欄位如text或者blob出現在業務表中。


5. 表字符集使用 utf8,必要時可申請使用 utf8mb4 字符集。

它的通用性比 gbk,latin1 都要好。utf8 字符集儲存漢字佔用 3 個位元組,如果遇到表情儲存的要求,就可以使用 utf8mb4


6. select 查詢表的時候只需要獲取必要的欄位,避免使用 select *。

這樣可以減少網路頻寬消耗,還有可能利用到覆蓋索引


7. 所有欄位定義中,預設都加上 not null 約束,避免出現 null。

在對該欄位進行 select count() 統計計數時,可以讓統計結果更準確,因為值為 null 的資料,不會被計算進去的。


8. 建立索引的時候不要在低基數列上建立索引,像 sex、status 這種欄位上面。

要通過索引的選擇性來判斷 select count(distinct col1)/count(*) from table_name; 越接近 1,證明選擇性越高,越適合建立索引。一般情況下,單表索引數量不要超過 4-5 個範圍。


9. SQL語句中,儘量避免出現 or 子句

這種判斷的子句可以讓程式自行完成,不要交給資料庫判斷。也要避免使用 union,儘量採用 union all,減少了去重和排序的工作。


10. 時時做好監控工作,經常對線上 sql 語句,進行線上捕獲進行分析。

可以利用 percona-toolkit 工具。


目前先寫這麼多,歡迎大家及時補充,其實好多工作都需要 DBA 和開發人員密切配合。新的業務要上線,DBA 就要參與到業務中,配合開發一起建表建模。我們只有一個目的,就是更舒服得工作,掙更多的錢,那為啥不能改變一下我們不好的工作習慣呢。工作中不是你想怎麼著,就怎麼著!繼續努力吧!



更多精彩文章:

MySQL資料庫“十宗罪”(十大經典錯誤案例)

資料庫優化之降龍十八掌


我的線上課程:MySQL 體系結構深入剖析及實戰 DBA 視訊課程

課程目標

通過對 MySQL 體系結構深入剖析講解,配合生產環境備份恢復,主從複製,高可用叢集架構和優化等實戰演練,讓同學們可以對 MySQL 資料庫有個由淺到深的認識。最後的課程部分還會對面試題總結進行講解,有利於同學們可以找到理想的 MySQL DBA 的工作。

適用人群

剛接觸MySQL資料庫的同學,有一定運維經驗的運維人員,想提高自己MySQL資料庫水平的DBA。