資料庫欄位及索引設計規範

2021-09-26 06:43:20 字數 2495 閱讀 4984

1. 優先選擇符合儲存需要的最小的資料型別1

原因:列的字段越大,建立索引時所需要的空間也就越大,這樣一頁中所能儲存的索引節點的數量也就越少也越少,在遍歷時所需要的 io 次數也就越多,索引的效能也就越差。

方法a. 將字串轉換成數字型別儲存,如:將 ip 位址轉換成整形資料

mysql 提供了兩個方法來處理 ip 位址

插入資料前,先用 inet_aton 把 ip 位址轉為整型,可以節省空間,顯示資料時,使用 inet_ntoa 把整型的 ip 位址轉為位址顯示即可。

方法b. 對於非負型的資料 (如自增 id,整型 ip) 來說,要優先使用無符號整型來儲存

原因:無符號相對於有符號可以多出一倍的儲存空間

signed int -2147483648~2147483647

unsigned int 0~4294967295

varchar(n) 中的 n 代表的是字元數,而不是位元組數,使用 utf8 儲存 255 個漢字 varchar(255)=765 個位元組。過大的長度會消耗更多的記憶體。

2. 避免使用 text,blob 資料型別,最常見的 text 型別可以儲存 64k 的資料

a. 建議把 blob 或是 text 列分離到單獨的擴充套件表中

mysql 記憶體臨時表不支援 text、blob 這樣的大資料型別,如果查詢中包含這樣的資料,在排序等操作時,就不能使用記憶體臨時表,必須使用磁碟臨時表進行。而且對於這種資料,mysql 還是要進行二次查詢,會使 sql 效能變得很差,但不是說一定不能使用這樣的資料型別。

如果一定要使用,建議把 blob 或是 text 列分離到單獨的擴充套件表中,查詢時一定不要使用 select * 而只需要取出必要的列,不需要 text 列的資料時不要對該列進行查詢。

b. text 或 blob 型別只能使用字首索引

因為 mysql[1] 對索引字段長度是有限制的,所以 text 型別只能使用字首索引,並且 text 列上是不能有預設值的

3. 避免使用 enum 型別

修改 enum 值需要使用 alter 語句;enum 型別的 order by 操作效率低,需要額外操作;禁止使用數值作為 enum 的列舉值

4. 盡可能把所有列定義為 not null

5. 使用 timestamp(4 個位元組) 或 datetime 型別 (8 個位元組) 儲存時間

timestamp 儲存的時間範圍 1970-01-01 00:00:01 ~ 2038-01-19-03:14:07;timestamp 占用 4 位元組和 int 相同,但比 int 可讀性高;超出 timestamp 取值範圍的使用 datetime 型別儲存

經常會有人用字串儲存日期型的資料(不正確的做法)

6. 同財務相關的金額類資料必須使用 decimal 型別

decimal 型別為精準浮點數,在計算時不會丟失精度;占用空間由定義的寬度決定,每 4 個位元組可以儲存 9 位數字,並且小數點要占用乙個位元組;可用於儲存比 bigint 更大的整型資料

1. 限制每張表上的索參數量,建議單張表索引不超過 5 個

索引並不是越多越好!索引可以提高效率,同樣可以降低效率。

索引可以增加查詢效率,但同樣也會降低插入和更新的效率,甚至有些情況下會降低查詢效率。

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

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

5.6 版本之前,乙個 sql 只能使用到乙個表中的乙個索引,5.6 以後,雖然有了合併索引的優化方式,但是還是遠遠沒有使用乙個聯合索引的查詢方式好。

3. 每個 innodb 表必須有個主鍵

innodb 是一種索引組織表:資料的儲存的邏輯順序和索引的順序是相同的。每個表都可以有多個索引,但是表的儲存順序只能有一種。

innodb 是按照主鍵索引的順序來組織表的

4. 常見索引列建議

5. 如何選擇索引列的順序

建立索引的目的是:希望通過索引進行資料查詢,減少隨機 io,增加查詢效能 ,索引能過濾出越少的資料,則從磁碟中讀入的資料也就越少。

6. 避免建立冗餘索引和重複索引(增加了查詢優化器生成執行計畫的時間)

7. 對於頻繁的查詢優先考慮使用覆蓋索引

覆蓋索引:就是包含了所有查詢字段 (where,select,ordery by,group by 包含的字段) 的索引

覆蓋索引的好處:

8. 索引 set 規範

盡量避免使用外來鍵約束

資料庫常用型別字段設計規範

強制 任何貨幣金額,均以最小貨幣單位且整型型別來進行儲存 儲存小數,必須使用decimal,不要用float和double等其他型別,否則可能會出現精度丟失 在decimal m,n 中 數字型別,可以指定它的精度和小數字數。格式 number precision,scale 整型型別,小數字數為 ...

資料庫命名及設計規範

1.資料庫涉及字元規範 我們約定 採用26個英文本母 區分大小寫 和0 9這十個自然數,加上下劃線 組成,共63個字元。不能出現其他字元 注釋除外 2.資料庫物件命名規範 我們約定,資料庫物件包括表 檢視 查詢 儲存過程 引數查詢 函式 約束。物件名字由字首和實際名字組成,長度不超過30。字首 使用...

資料庫命名及設計規範

1.資料庫涉及字元規範 我們約定 採用26個英文本母 區分大小寫 和0 9這十個自然數,加上下劃線 組成,共63個字元。不能出現其他字元 注釋除外 2.資料庫物件命名規範 我們約定,資料庫物件包括表 檢視 查詢 儲存過程 引數查詢 函式 約束。物件名字由字首和實際名字組成,長度不超過30。字首 使用...