mysql資料庫設計規範

來源:互聯網
上載者:User

標籤:兩種   order   distinct   計算   資料類型   char   執行計畫   單表   mil   

                           Mysql資料庫設計規範

1 資料庫所有對象均以小寫字母加底線(因為mysql是大小寫敏感的)

2 禁止使用mysql關鍵字

3 關聯列的列名和資料類型盡量保持一次,比如訂單表的使用者id user_id和購物車表裡面的使用者id  user_id,(因為如果不同的話,在關聯查詢時會進行隱式的轉換,這樣有可能造成列上的索引失效)

4 使用innodb為預設的儲存引擎

5 統一使用utf-8 字元集,mysql使用utf-8的一個字元,佔用三個位元組記憶體。如varchar(10)最多可佔用30個位元組

6 所有表和欄位均需要添加註釋,並且如果有枚舉含義的話注釋裡面需要指出欄位值的含義如 1代表進行中,2代表已完成等等

7 單表資料量最好控制在500萬行之內

8 UUID作為主鍵的優勢和劣勢是什嗎?

9 常用建立索引的列 where 從句出現 order by,group by distinct 列的出現 join 關聯列出現

10 聯合索引的建立原則

   1 區分度(唯一值的數量與總行數的比值)最高的列放在聯合索引的最左側

   2 在第一條相差不大的情況下,應該盡量把欄位長度小的列放在坐側

   3 避免冗餘索引和重複索引

11 盡量不使用外鍵約束,外鍵關係建議在業務代碼中實現(因為外鍵會降低效能)

12 優先選擇符合儲存需要的最小資料類型 如:

  1 將字串轉換為數字類型儲存 因為int類型佔用空間一般更小,(將ip地址轉為整形) INET_ATON(‘255.255.255.255‘) = 4294967295 ,同時mysql還提供反      向功能 INET_NTOA(4294967295) = ‘255.255.255.255‘

  2 非負數選擇unsigned儲存,因為這樣可以儲存的有效數更多

  3 VARCHAR(N)中的N代表字元數而不是位元組數

13 避免使用TEXT,BLOB等類型,這兩種類型會使得sql效能變差,但也不是說不能使用者兩種類型

14 避免是mysql的ENUM類型,枚舉本身是字串類型,但內部儲存使用整數類型進行儲存,因此只能儲存65535個值,這是枚舉類型的一個優點,化字串為整形儲存

  但枚舉類型也存在缺陷,修改ENUM值需要使用ALTER語句,ENUM 需要在進行order by操作時 需要先有整形轉字串 再進行排序操作,效率比較低 這也是字串轉整形的劣勢之一。另外 禁止使用整形值得枚舉類型

15  盡量把列都定義為not null, 第一 如果在這樣的列增加索引的話,null列需要更多的空間來儲存列是否為空白的狀態值,所以會佔用更多的索引空間,索引空間更大則索   引效率更低,其次 在進行比較和計算的時候 需要特別的處理

16  不要使用字串 儲存日期和時間 第一 無法使用時間函數 另外字串需要更多的空間來儲存

17  金額計算 使用decimal 類型 因為這種類型在計算的時候不會丟失精度

18 盡量使用先行編譯語句 ,第一 可以避免sql注入 ,第二 可多次使用執行計畫

19 避免隱式轉換 , sql隱式轉換一般出現在where 語句中 當列類型和參數類型不一致時就是容易出現飲食轉換 如主鍵id的 where id= ‘11‘ 隱式轉換可能導致索引   無效

 

20 避免 前置模糊查詢和全模糊查詢 這樣不會使用索引,後置模糊查詢則會使用索引

21  使用 left join 和not exists 來最佳化not in操作 not in 操作會使索引失效

22  禁止select *

23  避免使用子查詢 ,可以使用關聯查詢來進行最佳化,因為子查詢效率更低 首先子查詢返回的暫存資料表 無論是記憶體暫存資料表還是磁碟暫存資料表 都是無法使用索引的,如果   子查詢返回的資料量大這毫無疑問會降低sql效能 ,最後子查詢產生的大量的暫存資料表會消耗io和cpu資源 產生大量的慢查詢,

24 避免連表太多,mysql 本身最多能關聯61張表查詢,建議不超過5張表 ,關聯表太多會出現更多的關聯緩衝,一些關聯操作也會產生暫存資料表 暫存資料表是無索引的,會降低效能

25 合并多個alter操作 alter操作會阻塞表

26 使用in代替or,in操作 會有效使用索引

27 禁止使用 order by rand() 推薦 程式來擷取隨機值

28 避免在where 從句中進行函數轉換和計算 , 這樣無法使用索引

   可以使用以下來最佳化

  where date(create_time) = ‘20160601’ 可以最佳化為

   where create_time>=  ‘20160601’ and  create_time <  ‘20160602’ 

29 當明顯不含有重複值得時候,使用union all 而不是union,union會把所有資料放到暫存資料表中再進行去重操作 當資料量很大的時候 這種去重操作會使sql效能急劇下降   union all 則不會去重操作,比如合并多種類型的訂單操作 由於一個訂單只會屬於一個類型 這時候就可以使用union all了

30 盡量做到資料的冷熱分離 減小表的寬度,比如使用者表,常用的欄位 使用者名稱 密碼等等 屬於熱資料,而生日 性別 等等屬於冷資料 ,因此我們也把冷資料拆分為使用者    擴充表 達到分離的效果

 

mysql資料庫設計規範

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.