一、前言
良好的邏輯設計和物理設計是高性的基石,應該根據系統將要執行的查詢語句來設計schema,這往往需要權衡各種因素。例如,反正規化的設計可以加快某些型別的查詢,但同時也可能使另一些型別的查詢變慢。mysql獨有的特性和實現細節對效能的影響也很大。
二、選擇優化的資料型別
mysql支援的資料型別非常多,選擇正確的資料型別對獲取高效能非常重要。不管儲存哪種型別的資料,下面幾個簡單的原則都有助於做出更好的選擇。
一般情況下,應該盡量使用可以正確儲存資料的最小資料型別。更小的資料型別通常更快,因為他們占用更少的磁碟、記憶體和cpu快取,並且處理時需要的cpu週期更短。
但是要確保沒有低估需要儲存值的範圍,因為增加資料型別的範圍是乙個非常耗時或痛苦的操作。如果無法確定哪個資料型別是最好的,就選擇你認為不會超過範圍的最小型別。
簡單的資料型別操作通常需要更少的cpu週期。例如,整型比字串操作代價更低,因為字符集和校對規則使字元比較比整型比較更複雜。
很多表都包含可為null的列,即使應用程式並不需要儲存null也是如此,這是因為可為null是列的預設屬性。通常情況下最好指定列為 not null。
如果查詢中包含為null的列,對mysql來說更對優化,因為可為null的列使的索引和值比較都更為複雜。可為null的列會使用更多的儲存空間,也需要特殊的處理。當可為null的列被建立索引時,每個索引記錄需要乙個額外的位元組儲存,甚至可能導致固定大小的索引,變成可變大小的索引(例如只有乙個整數列的索引)
三、常用的資料型別
如果儲存整數可以使用這幾個整數型別:tinyint 、 smallint 、 mediumint 、 int 、 bigint,分別使用:8 、16 、24 、32 、64位儲存空間,儲存範圍從:-2的n減一次方 到 2的n減一次方減一,其中n是儲存空間的位數。
二進位制位
十進位制範圍
byte
無符號有符號
tinyint
80~255
-128~127
1smallint
160~65535
-32768~32767
2mediumint
240~16777215
-8388608~8388607
3int
320~4294967295
-2147483648 ~ 2147483647
4bigint
640~18446744073709551615
-9223372036854775808~9223372036854775807
8實數是帶有小數部分的數字。然而,它們不只是為了儲存小數部分;也可以用decimal儲存比bigint還大的整數。mysql既支援精確型別,也支援不精確型別。
float和double型別支援使用標準的浮點運算進行近似計算。
浮點和decimal型別都可以指定精度。對於decimal列,可以指定小數點前後所允許的最大位數。例如:decimal(5,3)表示最長可以存5位,小數點前2位加小資料點後3位。如果設定乙個大於2位的整數(123.000)會報錯(1264 - out of range value for column 'e' at row 1);如果設定乙個大於3位的小數會四捨五入為3位後再儲存(12.1235 => 12.124)
varchar
varchar型別用於儲存可變長的字串,是最常見的字串型別。它比定長類更節省空間,因為它僅使用必要的空間。
varchar需要使用1或2個額外位元組記錄字串的長度:如果列的最大長度小於或等於255,則只使用1個位元組,否則使用2個位元組。
varchar節省了儲存空間,所以對效能也有幫助。但是,由於是變長的,在update時可能使行變得比原來更長,這就導致了額外的工作。如果乙個行占用的空間在頁內沒有更多的空間可以儲存,在這種情況下myisam會將行拆成不同的片段儲存,innodb則需要**頁來使行可以放進頁內。
char
char型別是定長的:mysql總是根據定義的字串長度分配足夠的空間。
char會根據需要採用空格進行填充。
對於非常短的列,char比varchar在儲存空間上更有效率,例如char(1)來儲存y和n只需要乙個位元組,但varchar(1)確需要兩個位元組,因為還有乙個記錄長度的額外位元組。
blob和text型別
都是為儲存很大的資料而設計的字串型別,分別採用二進位制和字元方式儲存。
mysql不能將blob和text列全部長度的字串進行索引,只允許建立字首索引,也不允許有預設值。
datetime
這個型別的儲存範圍從2023年到2023年,精度為秒。它把日期和時間封裝到合適為yyyymmddhhmmss的整數中,與時區無,使用8個位元組的儲存空間。
timestamp
timestamp型別儲存了從2023年1月1日午夜(格林尼治標準時間)以來的秒數,只能表示從2023年到2023年,使用4個位元組的儲存空間。
CSS寫作建議和效能優化總結
今年難得遇到中秋和國慶,已經放假幾天了,我也回到家了。今天還是比較開心的,搶了比較多的紅包,嘿嘿。紅包搶完了,現在也空下來寫點部落格咯。這裡是我從網上的一篇文章看過來的,這裡先做一點小結,之後再補充。1.css渲染規則 今天在微博的一篇文章上看到的,之前我都以為渲染是從左往右渲染。發現我的想法是錯的...
mysql優化建議
1.建立 2.sql編寫mysql欄位型別 資料型別 含義date 3位元組,日期,格式 2014 09 18 time 3位元組,時間,格式 08 42 30 datetime 8位元組,日期時間,格式 2014 09 18 08 42 30 timestamp 4位元組,自動儲存記錄修改的時間 ...
MySQL優化建議
設計資料表的時候要遵守三正規化,但是不要嚴格遵守。可以適度打破正規化。乙個表字段不適合過多。常用表中只要保留常用的字段 盡量給每個字段新增not null 根據表的特點來選擇合適的表引擎,如果這個表經常被寫,應該選擇innodb,但是mysql5.6一般都是選擇innodb 根據表存放的資料來決定字...