程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 高性能Mysql——Schema與數據類型優化

高性能Mysql——Schema與數據類型優化

編輯:MySQL綜合教程

高性能Mysql——Schema與數據類型優化


良好的邏輯設計和物理設計師高性能的基石
一、選擇優化的數據類型
更小的通常更好
占用更小的磁盤、內存、CPU緩存和處理時需要的CPU周期
簡單就好
操作需要更少的CPU周期,例如:整型比字符型操作代價更低,以為字符集和校對規則使字符比整型更復雜。應該使用Mysql內建的類型而不是字符串來存儲日期和時間,另外一個是應該用整型存儲IP地址。
盡量避免NULL
通常情況最好指定列為not null,除非真的需要存儲null值。如果查詢包含null的列,對Mysql的來說更難優化,null的列是的索引、索引統計和值比較都更復雜。當可為null的列被索引時,每個索引記錄需要一個額外的字節,在Myisam裡甚至還可能導致固定大小的索引變成可變大小的索引。通常可以把可為null的列該為not null帶來的性能提升比較小。如果計劃在列上建索引,就應該盡量避免設計成可為null的列。當然也有例外:InnoDB使用單獨的位(bit)存儲null值,所以對於稀疏數據(很多值null)有很好的空間效率。
1、整數類型
TINYINT 8
SMALLINT 16
MEDIUMINT 24
INT 32
BIGINT 64
整數類型可選UNSIGNED表示不允許為負數,可以使正數上線提高一倍。
Mysql可以為正數類型指定寬度,對於存儲計算來說int(1)和int(20)是相同的。
2、實數類型
實數是帶有小數部分的數字。decimal類型用於存儲精確的小數
float使用4個字節存儲,double使用8個字節
3、字符串類型
varchar和char類型
varchar類型用於存儲可變長字符串,他比定長類型更節省空間,如果Mysql表使用row_format=fixed創建的話,每一行都會使用定長存儲,這會很浪費時間。varchar需要使用1或2個額外字節記錄字符串的長度,如果列的最大長度小於或等於255字節,則只使用1個字節表示,否則使用2個字節。varchar節省了存儲空間,但是由於行是可變的,在update時可能使行變得比原來更長,下面這幾種情況使用varchar是合適的:
字符串列的最大長度比平均長度大很多,列的更新很少,所以碎片不是問題;使用了像UTF-8這樣復雜的字符集,每個字符都使用不同的字節數進行存儲。
InnoDB可以把過長的varchar存儲為blob
char類型是定長的:Mysql總是根據定義的字符串長度分配足夠的空間。char適合存儲很短的字符串,或者所有的值都接近同一個長度。例如:char非常適合存儲密碼的MD5值,因為這是一個定長的值。對於經常變更的數據char也比varchar更好,因為定長不容易產生碎片。對於非常短的列,char比varchar在存儲空間上更有效率。例如:用char(1)來存儲只有Y和N的值,如果采用單字節字符字符集(字符串長度定義不是字節數,是字符數,多字節字符需要更多的存儲空間)只需要一個字節,但是varchar(1)卻需要2個字節,因為還有一個記錄長度的額外字節。
blob和text類型
都是為存儲很大的數據而設計的,分別采用二進制和字符方式存儲。Mysql不能將他們全部長度進行索引。
使用枚舉型代替字符串類型
枚舉可以把一些不重復的字符串存儲成一個預定義好的集合。
create table enum_test(e enum(‘fish’,’apple’,’dog’) not null);
insert into enum_test(e) values(‘fish’),(‘dog’),(‘apple’);
4、日期和時間類型
datetime
精確度為秒,他把日期和時間封裝到YYYYMMDDHHMMSS整數中,與時區無關使用8個字節存儲空間
timestamp
他和Unix的時間戳相同,他只使用4個字節的存儲空間,因此它的范圍比datetime小的多,1970-2038,Mysql提供了from_unixtime()函數把Unix時間戳轉換為日期,依賴於時區。
5、位數據類型
bit
可以使用bit列在一列中存儲一個或多個true/false值。bit列最大長度是64個位,實際中使用較少。
set
如果需要保存很多true/false值可以考慮合並這些列到一個set數據類型。
6、選擇標識符
標識列也可能在另外的表中作為外鍵使用,所以為標識列選擇數據類型時,應該選擇跟關聯表中的對應列一樣的類型。在可以滿足值的要求,並且預留未來增長空間的前提下,應該選擇最小的數據類型。
字符串類型
如果可能,應該避免使用字符串類型作為標識類,因為他們很耗空間,並且通常比數字類型慢。
如果存儲UUID值,則應該移除”-“符號,或者更好的做飯是用unhex()函數轉換UUID值為16字節數字,並且存儲在一個binary(16)列中,檢索時可以通過hex()函數來格式為十六進制格式。
7、特殊數據類型
IPv4我們經常使用varchar(15)列來存儲IP地址,然而他們實際上市32位無符號整數,不是字符串。用小數點分成4段的表示方法只是為了讓人們容易閱讀。所以應該用無符號整數存儲IP地址。Mysql提供inet_aton()和inet_ntoa()函數在這兩種方法之間轉換。
二、緩存表和匯總表
我們用緩存表來表示存儲那些可以比較簡單的從schema其他表獲取數據的表。舉個例子:
假如要統計一個網站之前24小時內發送的消息數。在一個很繁忙的網站不可能維護一個實時精確的計數器。作為代替方案,可以每小時才、生成一張匯總表,比維護實時計數器高效得多。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved