天天看點

mysql 之 schema與資料類型優化

一.選擇優化的資料類型

    1.更小的通常更好:如果隻要儲存1~200,tinyint unsigned更好.因為占用更小的記憶體和磁盤空間.

    2.簡單就好: 簡單資料類型需要更小的CPU時間周期.例如:整型比字元操作代價更低(字元集的問題).使用mysql自帶類型取代字元串(date,datetime),使用整型存儲IP.

    3.盡量避免Null:單列索引無法儲null值,複合索引無法儲全為null的值.Innodb使用單獨的位(bit)存儲Null值,是以對于稀疏結構(列中大部分都是Null)有很好的空間效率.(不适用myisam).

    4.mysql資料類型可以存儲相同類型的資料,隻是存儲的長度和範圍不一樣,允許的精度不同,需要的空間不同.

  例如:Datetime和timestamp可以存儲相同類型的資料,然而timestamp隻占用一半的空間.但是它有一個時間範圍.

   1.1 整數類型      

   整數可以使用: tinyint,smallint,mediumint,int,bigint.分别使用8,12,16,24,32,64位存儲空間.存儲範圍是-2的n-1次方到2的n-1次方.

   1.2 實數類型

   Decimal可以存儲比bigint更大的整數.(最多允許65個數字)

  1.3 字元串類型

     varchar 

          比定長的更省空間,如果設定了ROW_FORMAT=FIXED 就不起作用.varchar需要額外一個或兩個位元組記錄字元串長度.

          下列情況使用varchar是合适的: 字元串列的最大長度比平均長度大很多; 列的更新很少;使用 UTF8這樣的字元集,每個字元使用不同位元組數存儲。

    char

         char類型是定長的:char會删除資料末尾的所有空格.

    enum

        使用枚舉代替字元類型.

        例如: create table test { e enum('fish','apple','pear') not null}.

        select e + 0 from test 結果會是數字

 二.加快alter table速度

     alter table modify column ....   會拷貝整張表到另一張表

     alter table alter column...   隻修改.frm檔案而不涉及表資料,這個操作很快

三.快速建立myisam索引

     alter table  tablename disable keys;//禁用索引

     load data;

     alter table  tablename enable keys;//啟用索引

     不過這種方法對于唯一索引不起作用