表
下面是阿里的mysql設計原則,可以參考,不一定按照阿里規則,但一個團隊一定要有規則,如果現在沒有規則,從現在開始,慢慢推廣,適應
1.【強制】表達是與否概念的字段,必須使用 is_xxx的方式命名,數據類型是 unsigned tinyint( 1表示是,0表示否) 說明:任何字段如果為非負數,必須是 unsigned。
2.【強制】表名、字段名必須使用小寫字母或數字;禁止出現數字開頭,禁止兩個下劃線中間只出現數字。數據庫字段名的修改代價很大,因為無法進行預發布,所以字段名稱需要慎重考慮。 正例:getter_admin,task_config,level3_name 反例:GetterAdmin,taskConfig,level_3_name
3.【強制】表名不使用復數名詞。 說明:表名應該僅僅表示表里面的實體內容,不應該表示實體數量,對應于 DO類名也是單數形式,符合表達習慣。
4.【強制】禁用保留字,如 desc、range、match、delayed等,請參考 MySQL官方保留字。
5.【強制】唯一索引名為 uk_字段名;普通索引名則為 idx_字段名。 說明:uk_ 即 unique key;idx_ 即 index的簡稱。
6.【強制】小數類型為 decimal,禁止使用 float和 double。 說明:float和 double在存儲的時候,存在精度損失的問題,很可能在值的比較時,得到不正確的結果。如果存儲的數據范圍超過 decimal的范圍,建議將數據拆成整數和小數分開存儲。
7.【強制】如果存儲的字符串長度幾乎相等,使用 char定長字符串類型。
8.【強制】varchar是可變長字符串,不預先分配存儲空間,長度不要超過 5000,如果存儲長度大于此值,定義字段類型為 text,獨立出來一張表,用主鍵來對應,避免影響其它字段索引效率。
9.【強制】表必備三字段:id, gmt_create, gmt_modified。 說明:其中 id必為主鍵,類型為 unsigned bigint、單表時自增、步長為 1。 gmt_create,gmt_modified的類型均為 date_time類型。
10.【推薦】表的命名最好是加上“業務名稱_表的作用”。 正例:tiger_task / tiger_reader / mpp_config
11.【推薦】庫名與應用名稱盡量一致。
12.【推薦】如果修改字段含義或對字段表示的狀態追加時,需要及時更新字段注釋。
13.【推薦】字段允許適當冗余,以提高性能,但是必須考慮數據同步的情況。冗余字段應遵循: 1)不是頻繁修改的字段。 2)不是 varchar超長字段,更不能是 text字段。 正例:商品類目名稱使用頻率高,字段長度短,名稱基本一成不變,可在相關聯的表中冗余存儲類目名稱,避免關聯查詢。
14.【推薦】單表行數超過 500萬行或者單表容量超過 2GB,才推薦進行分庫分表。 說明:如果預計三年后的數據量根本達不到這個級別,請不要在創建表時就分庫分表。
15.【參考】合適的字符存儲長度,不但節約數據庫表空間、節約索引存儲,更重要的是提升檢索速度。 正例:人的年齡用 unsigned tinyint(表示范圍 0-255,人的壽命不會超過 255歲);海龜就必須是 smallint,但如果是太陽的年齡,就必須是 int;如果是所有恒星的年齡都加起來,那么就必須使用 bigint
創建索引的原則
1. 對查詢條件,分組條件,排序條件的字段創建索引,有可能是多列索引,update時后面的條件語句也屬于查詢條件
2. 創建索引對更新插入刪除有影響,相反
3. 索引字段的長度越小越好,這里指的是性能
Mysql存儲引擎使用的B+Tree
B+樹是演變過來的,首先是二叉查找樹,平衡二叉樹,B樹
1.二叉查找樹,樹種結點的度不大于2的有序樹,最多結點數:2^n -1 ,n為數的高度,如n=3,最多7個結點,n=5,最多31個結點(達到最大結點數叫做滿二叉樹)
某一層的最多結點個數 2^(n-1) ,如果n=3,第三層最多4個結點,如n=30,第31層最多 2^30=1073741824,記住這一點,后面會用到
2. 二叉樹如果在不控制的情況下會變為一條直線,失去了查找優勢,這時出現二叉平衡樹
3. B樹,二叉樹實際情況無法使用,因為需要n多次的磁盤IO,B樹,一個結點存儲更多的key,同時存儲數據
4. B+樹,為了存儲更多的key值,同時考慮到數據庫查詢的其它需要,B樹結點不存儲數據,只存儲key,所有數據存儲在葉子結點
5. mysql默認頁大小16k,能存儲多少數據記錄和數據庫記錄大小有關系,假設葉子結點存儲16條數據,一條記錄大小1K,非葉子結點存儲1000個key
高度為3 ,總記錄數就是 1000*1000*16 = 16000000.
視圖,記錄,字段
每種數據庫有自己視圖,我們常說的視圖一般是關系視圖,可以關聯一張或幾張表,方便信息查詢和權限控制等
數據庫事務
ACID ,mysql數據庫隔離級別 ,Read Uncommited ,Read Commited ,Repeatable Read,Serialiable,注意,mysql是這幾種隔離級別,其它數據庫不一定有
臟數據,讀到了沒有提交的數據
不可重復讀,一個事務在執行過程中,兩次讀的數據不一致,解決方法是mvvc
幻讀,數據做了插入或刪除操作,但是其它事務插入或刪除了某條數據,出現沒有刪除干凈,或者都刪除了的情況,在可重復讀的隔離級別下,快照讀不會出現幻讀,當前讀時,innodb 通過間隙鎖和行鎖共同作用控制,使得查詢語句掃描到的數據及數據中間不能插入也不允許修改,從而不會出現幻讀現象。
SQL和存儲過程
SQL99和SQL92