Mysql優化建議和常用資料型別

2021-10-10 13:42:59 字數 2518 閱讀 7937

一、前言

良好的邏輯設計和物理設計是高性的基石,應該根據系統將要執行的查詢語句來設計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 根據表存放的資料來決定字...