1. 程式人生 > >Mysql效能優化之資料型別優化

Mysql效能優化之資料型別優化

一、選擇正確的資料型別對於獲得高效能至關重要
1.1更小的通常更好
佔用更少的磁碟、記憶體和CPU快取
1.2儘量避免null
如果查詢中包含可為null的列,對Mysql來說更難優化,因為可為null的列使得索引、索引統計和值都更復雜。會使用更多的儲存空間.
2、整數和實數
整數tinyint、smallint、mediumint、int、bigint分別使用8,16,24,32,64位儲存空間
實數delcimal儲存精確的小數支援精確運算、float和double支援浮點運算進行近似計算
3、字串型別
varchar和char型別
varchar型別用於儲存可變長字串,比定長型別更節省空間。varchar需要使用1或者2個額外位元組記錄字串長度,如果列的最大長度小於或等於255位元組需要使用1個位元組表示否則使用2個位元組,比如一個varchar(10)的列需要11個位元組的儲存空間。varchar(1000)的列需要1002個位元組。
char型別是定長的,char很適合儲存很短的字串,或者所有值都接近同一個長度
4、blob和text型別


blob和text型別分別採用二進位制和字元方式儲存
5、enum列舉型別
列舉字串列表是固定的,新增或刪除字串必須使用alter table。
6、日期和時間型別
datetime和timestamp。
datetime能儲存很大範圍的值,從1001年到9999年精度為秒,他把日期封裝到YYYYMMDDHHMMSS的整數中,與時區無關。使用8個位元組的儲存空間。
timestamp型別儲存了從1970年1月1日午夜以來的描述,timestamp只使用了4個位元組的儲存空間只能表示1970年到2038年。timestamp預設為not null。
除了特殊行為之外,通常應該儘量使用timestamp,因為它比datatime空間效率更高。
7、選擇識別符號(identifier)

為標識列選擇資料型別的時候應該選擇與關聯表一樣的型別,整數通常是標識列最好的選擇,並且可以使用auto_increment。
二、mysql schema設計中的陷阱
2.1太多的列
mysql的儲存引擎api工作時需要在服務層和儲存引擎層之間通過行緩衝格式拷貝資料,然後在服務層將緩衝內容解碼成各個列。從行緩衝中將編碼過的列轉換行資料結構的操作代價是非常高的
2.2太多的關聯
mysql限制了每個關聯操作最多隻能有61張表,單個查詢最好在12個表以內做關聯
2.3alter table操作的速度
mysql的alter table操作的效能對大表來說是個大問題。mysql執行大部分修改表結構操作的方法是用新的結構建立一個空白表,從舊錶中查出所有資料插入新表,然後刪除舊錶。
所有的modify column操作都將導致表重建,理論上列的預設值儲存在.frm檔案中,但是可以通過alter column操作來改變列的預設值
alter table xxx
alter column xxx set default 5;
alter table 是件讓人痛苦的操作,大部分情況下都會鎖表並且重建整張表。