MySQL優化之概述及字段設計(一)

MySQL優化之概述及字段設計(一)

在日常開發中,MySQL的優化是必不可少的,下面就來簡單的介紹一下爲什麼要優化,怎麼去優化

優化概述

爲什麼要優化:

  1. 當我們的應用吞吐量到達了數據庫的處理速度之上
  2. 數據庫隨着應用逐漸增多,處理壓力逐漸增大
  3. 存放在磁盤上的數據庫,相比於內存中的數據 讀寫要慢

如何優化:

  1. 表,字段設計,結合業務考量更優的存儲和計算
  2. 數據庫本身提供的優化功能,比如索引等
  3. 主動複製,讀寫分離,分區分表,負載均衡等
  4. SQL語句的優化,區分SQL中的關鍵用法,比如join,left join,right join等

字段設計

一、精度要求
1、DECIMAL
DECIMAL數據類型用於在數據庫中存儲精確的數值。我們經常將DECIMAL數據類型用於保留準確精確度的列,例如會計系統中的貨幣數據。

創建方式爲:column_name DECIMAL(P,D);
P 有效數字的精度 範圍1-65
D 小數點後面的位數 0-30

與INT數據類型一樣,DECIMAL類型也具有UNSIGNED和ZEROFILL屬性。 如果使用UNSIGNED屬性,則DECIMAL UNSIGNED的列將不接受負值。

2、小數轉整數
FLOOR(X)函數
該函數的作用是將小數的小數部分去除,只留下整數部分,並且不進行四捨五入。
例:select FLOOR(5.5) 輸出爲5

ROUND(X,D)函數和TRANCATE(X,D)函數
兩個函數都可以用來對小數保留指定小數位數,其中第二個參數D用來指定要保留到第幾位。差別是前者會進行四捨五入,而後者不會。
例:select ROUND(5.5,1) select TRANCATE(5.5,1) 前者輸出 5.5 後者輸出 5.6

二、儘量使用整數表示字符串
IP 存儲
當前很多應用都適用字符串char(15)來存儲IP地址(佔用16個字節),利用inet_aton()和inet_ntoa()函數,來存儲IP地址效率很高,適用unsigned int 就可以滿足需求,不需要使用bigint,只需要4個字節,節省存儲空間,同時效率也高很多。

函數名:INET_ATON(EXPR)
函數功能:給出一個作爲字符串的網絡地址,返回一個代表地址數值的整數。’

函數名:INET_NTOA(EXPR)
函數功能:給定一個數字網絡地址,返回作爲字符串的該地址的電地址表示。

三、儘可能使用 not null
空值不佔空間,null 佔用空間
字段屬性爲not null 時,插入null 會報錯,插入 ‘’ 則不會
NULL 其實並不是空值,而是要佔用空間,所以mysql在進行比較的時候,NULL 會參與字段比較,所以對效率有一部分影響。
而且B樹索引時不會存儲NULL值的,所以如果索引的字段可以爲NULL,索引的效率會下降很多。

四、定長和非定長的選擇
1、較長的數字可以選擇DECIMAL
2、char 爲定長,超出長度會被截取,varchar 爲非定長,varchar 對長度的保存佔用數據空間

五、數據庫三範式
第一範式:字段的原子性(關係性數據庫有列的概念)
第二範式:消除對主鍵的部分依賴,使用一個與業務無關的字段作爲主鍵
第三範式:消除對主鍵的傳遞依賴

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章