《高效能mysql》二schema與資料型別優化

2021-09-28 20:53:43 字數 2053 閱讀 8286

(1)更小的通常更好

一般情況下,應該盡量使用可以正確儲存資料的最小資料型別。更小的資料型別通常更快,因為他們占用更少的磁碟、記憶體和cpu快取,並且處理時需要的cpu週期也更少。

(2)簡單就好

簡單資料型別的操作通常需要更少的cpu週期。

(3)盡量避免null

通常情況下最好指定列為not null, 除非真的需要儲存null值。可為null的列會使用更多的儲存空間,在mysql中也需要額外處理。同時,可為null的列被索引時,每個索引記錄需要乙個額外的位元組。

很多mysql的資料型別可以儲存相同的資料,只是儲存的長度和範圍不一樣,允許的精度不同,或者需要的物理空間不同。

例如, datetime和timestamp列都可以儲存相同型別的資料:時間和日期,精確到秒。然而timestamp只使用datetime一般的儲存空間,並且會根據時區變化,具有特殊的自動更新能力。另一方面,timestamp允許的時間範圍要小得多。

(1)整數型別

如果儲存整數,可以使用這幾種整數型別:tinyint,smallint,mediumint,int,bigint,分別使用8、16、24、32、64位儲存空間,整數型別有可選的unsigned屬性,表示不允許負值,這大致可以使正數的上限提高一倍。不同的型別決定了mysql是怎麼在記憶體和磁碟中儲存資料的。然而,整數計算一般使用64位的bigint整數。

mysql可以為整數型別指定寬度,例如int(11),對大多數應用來說,這是沒有意義的:它不會限制值的合法範圍,只是規定了mysql的一些互動工具用來顯示字元的個數。

(2)實數型別

浮點型別在儲存同樣範圍的值時,通常比decimal使用更少的空間。float使用4個位元組儲存,double占用8個位元組,相比float有更高的精度和更大的範圍。和整數型別一樣,能選擇的只是儲存型別,mysql使用double作為內部浮點計算的型別。

因為需要額外的空間和計算開銷,所以應該盡量只在對小數進行精確計算時才使用decimal(例如儲存財務資料)。在資料量比較大的時候,可以考慮使用bigint代替decimal,將需要儲存的貨幣單位根據小數的位數乘以相應的倍數即可。

(3)字串型別

varchar

varchar用於儲存可變長字串,它比定長型別更節省空間,因為它僅使用必要的空間,varchar使用1到2個額外的位元組記錄字串的長度。

如果乙個行占用的空間增長,並且在頁內沒有更多的空間可以儲存,在這種情況下,不同的儲存引擎的處理方式是不一樣的。例如myisam會將行拆成不同的片段儲存,innodb則需要使用**頁來使行可以放進頁內。

下面這些情況使用varchar是合適的:

字串列的最大長度比平均長度大很多。

列的更新很少,所以碎片不是問題。

使用了像utf-8這樣複雜的字符集,每個字元都使用不同的位元組數進行儲存。

使用varchar(5)和varchar(100)儲存』hello』的空間開銷是一樣的、那麼使用更短的列有什麼優勢?

事實證明有很大的優勢,更長的列會消耗更多的記憶體,因為mysql通常會分配固定大小的記憶體塊來儲存內部值,所以最好的策略是只分配真正需要的空間。

char

char型別是定長的,mysql總是根據定義的字串長度分配足夠的空間。char適合儲存很短的字串,或者所有值都接近同乙個長度。

(4)日期和時間型別

datetime

這個型別能儲存大範圍的值,從2023年到2023年,精度為秒。它把日期和時間封裝到格式為yyyymmddhhmmss的整數中,與時區無關。使用8個位元組的儲存空間。

timestamp

timestamp儲存了從2023年1月1日午夜以來的秒數,它和unix時間戳相同。timestamp只使用4個位元組的儲存空間,因此它的範圍比datetime小很多,只能表示從2023年到2023年。timestamp表示的值也依賴於時區。

除了特殊行為之外,通常也應該盡量使用timestamp,因為它比datetime空間效率更高。

mysql執行大部分修改表結構操作的方法是用新的結構建立乙個空表,從舊表中查出所有資料插入新錶,然後刪除舊表。

高效能MySQL(三) Schema與資料型別優化

mysql schema設計中的問題 mysql支援的資料型別非常多,選擇正確的資料型別對於獲得高效能至關重要。下面幾個簡單的原則有助於做出更好的選擇 更小的通常更好 簡單就好 避免null 本篇預設儲存引擎是innodb 有兩種型別的數字 整數和實數。如果儲存整數,可以使用這幾種整數型別 tiny...

高效能mysql 樹 高效能mysql精要

1 explain 中 extra using index 表示覆蓋索引,sql優化中最好能使用覆蓋索引,否則 二級索引 需要回表查詢。所謂覆蓋索引,是指要查詢的列正好是索引,而條件也是這個索引之一 2 where 語句中 條件等於主鍵的 在核心索引層完成,條件等於非索引的,在服務層完成 3 讀索引...

mysql高效能索引 mysql高效能索引( )

在開發中,我們知道大多數應用的瓶頸在於sql語句的執行時耗,在這裡並不討論sql語句的安全,僅僅討論高效能sql語句,而與高效能sql語句緊密相連的就是傳說中的 索引。索引 一種工作在儲存引擎端的用於快速找到記錄的一種資料結構。mysql使用索引的方式是 先找到索引的值,再根據索引的值找到資料行。索...