day2-MySQL规约
前言
如果沒有統一的約定,那么必然會帶來許多額外的工作。例如:JDBC規范。如果沒有這個規范,每個數據庫廠商都各自為政,開發自己的一套與數據庫交互的驅動,那可想而知,對于開發者而言無疑會增加負擔和工作。這里,我們來聊一聊,編碼規范中的MySQL規范。
MySQL規約
建表規約
表或字段命名
即使以逗號分隔的,有集合意義的字段也不要這樣取名。這類字段不應太多。同時如果存儲的值太大,應當作為大字段對待。
避免在某些情況下發生沖突。
這個需要注意:在做ORM映射時,字段不要使用isXxx,而應當把is干掉,避免某些框架做Bean解析造成錯誤。而java類型,可以用boolean.
數據類型
| 小數 | decimal | 避免計算上的錯誤(小數和整數是單獨存儲的) |
| 貨幣 | bigint | 用最小單位-分,避免小數運算 |
| 字符型 | char | 值域長度幾乎相同(不夠長度,自動填空格) |
| 字符型 | varchar | 需要用1-2個字節來記錄長度,最長不要超過5000.與char的區別 |
表中必要字段
id主鍵
create_time創建時間
udpate_time更新時間
推薦規約
注意,如果單表數據量太大了,因為此時查詢效率更多的受數據量的影響。數據量大的表,可以考慮只做單表查詢,再把其關聯字段通過索引來查詢其他表,如果頻繁查詢的字段可以考慮緩存。
索引規約
索引的特點:持久性(占用存儲空間)、有序性。
索引(Index)是幫助數據庫高效獲取數據的數據結構
索引分類
按是否存儲數據分:
- 聚簇索引:葉子節點存儲的是數據。
- 非聚簇索引:葉子節點存儲的是主鍵。
按是否帶有唯一約束:
- 唯一索引
- 普通索引
主鍵是唯一標識一個實體的一個屬性或屬性集。
數據庫會默認給主鍵子彈建立一個比較特殊的索引,既在葉子節點存儲數據,也會帶有一個唯一約束。所以主鍵索引既是聚簇索引,也是唯一索引。通常一個表只有一個聚簇索引,因為數據只存儲一份。
索引命名規約
主鍵索引名:pk_表名_字段名
唯一索引名:uk_表名_字段名
普通索引名:idx表名_字段名
創建規約
說明:索引的長度與區分度是一對矛盾體,一般對字符串類型數據,長度為20的索引,區分度會高達90%以上,可以使用count(distinct left(列名, 索引長度))/count(*)的區分度來確定。
小結
索引會占用存儲空間
索引可以提高查詢效率
索引會影響記錄更新和插入效率
在創建索引時,應當綜合權衡對查詢效率和更新插入的效率,合理創建索引。因為創建索引需要先排序,所以優先使用天然有序的數據類型。推薦使用數字型數據類型,這樣一來減少空間占用,而來效率高。
SQL規約
知乎上有大佬說因為MySQL的優化器和執行器都比較弱。
回表,是指對于像MySQL-innodb引擎這樣的通過聚簇索引來存儲數據的,通過普通索引查詢數據時,需要再更加其葉子節點的主鍵再到主鍵索引中查找數據的過程。
而像PostgreSQL這樣使用堆表存儲數據的,所有的索引的葉子節點存儲的都是數據在堆表中的坐標,不管是主鍵索引還是普通索引,都是要回表才能取出數據。
避坑指南
優化目標
結合Explain,將SQL優化到range級別以上。
ORM映射規約
避免更新不需要更新的字段。其一容易出錯,其二效率低,其三增加binlog存儲負擔。
總結
以上是生活随笔為你收集整理的day2-MySQL规约的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spss20学习之(一)
- 下一篇: WGS84 CGCS2000 北京54