mysql開發36條軍規

寫在前面的話:mysql

老是在災難發生後,纔想起容災的重要性;sql

老是在吃過虧後,才記得曾經有人提醒過。數據庫

(一)核心軍規函數

(1)不在數據庫作運算工具

   cpu計算務必移至業務層;性能

(2)控制單表數據量優化

   int型不超過1000w,含char則不超過500w;spa

   合理分表;排序

   限制單庫表數量在300之內;索引

(3)控制列數量

   字段少而精,字段數建議在20之內;

(4)平衡範式與冗餘

   效率優先;

   每每犧牲範式;

(5)拒絕3B

   拒絕大sql語句:big sql

   拒絕大事物:big transaction

   拒絕大批量:big batch


(二)字段類軍規

(6)用好數值類型

   tinyint(1Byte)

   smallint(2Byte)

   mediumint(3Byte)

   int(4Byte)

   bigint(8Byte)

   bad case:int(1)/int(11)

(7)字符轉化爲數字

   用int而不是char(15)存儲ip

(8)優先使用enum或set

   例如:`sex` enum (‘F’, ‘M’)

(9)避免使用NULL字段

   NULL字段很難查詢優化;

   NULL字段的索引須要額外空間;

   NULL字段的複合索引無效;

   bad case:

    `name` char(32) default null

    `age` int not null

   good case:

    `age` int not null default 0

(10)少用text/blob

    varchar的性能會比text高不少;

    實在避免不了blob,請拆表;

(11)不在數據庫裏存圖片

    這個我不能理解!

    但這是趕集網的經驗,求detail!


(三)索引類軍規

(12)謹慎合理使用索引

    改善查詢、減慢更新;

    索引必定不是越多越好(能不加就不加,要加的必定得加);

    覆蓋記錄條數過多不適合建索引,例如「性別」;

(13)字符字段必須建前綴索引

(14)不在索引作列運算

!!!不僅是索引,都不能作列運算吧!!!

    bad case:

    select id where age +1 = 10;

(15)innodb主鍵推薦使用自增列;

    主鍵創建聚簇索引;

    主鍵不該該被修改;

    字符串不該該作主鍵;

    若是不指定主鍵,innodb會使用惟一且非空值索引代替;

(16)不用外鍵

    請由程序保證約束;


(四)sql類軍規

(17)sql語句儘量簡單

    一條sql只能在一個cpu運算;

    大語句拆小語句,減小鎖時間;

    一條大sql能夠堵死整個庫;

(18)簡單的事務

    事務時間儘量短;

    bad case:

    上傳圖片事務

(19)避免使用trig/func

    觸發器、函數不用;

    客戶端程序取而代之;

(20)不用select *

    消耗cpu,io,內存,帶寬;

    這種程序不具備擴展性;

(21)OR改寫爲IN()

    or的效率是n級別;

    in的消息時log(n)級別;

    in的個數建議控制在200之內;

      select id from t where phone=’159′ or phone=’136′;

      =>

      select id from t where phone in (’159′, ’136′);

(22)OR改寫爲UNION

    mysql的索引合併很弱智

     select id from t where phone = ’159′ or name = ‘john’;

     =>

     select id from t where phone=’159′

     union

     select id from t where name=’jonh’

(23)避免負向%

(24)慎用count(*)

(25)同上

(26)limit高效分頁

    limit越大,效率越低

    select id from t limit 10000, 10;

    =>

    select id from t where id > 10000 limit 10;

(27)使用union all替代union

    union有去重開銷

(28)少用鏈接join

(29)使用group by

    分組;

    自動排序;

(30)請使用同類型比較

(31)使用load data導數據

    load data比insert快約20倍;

(32)打散批量更新

(33)性能分析工具

    show profile;

    mysqlsla;

    mysqldumpslow;

    explain;

    show slow log;

    show processlist;

    show query_response_time(percona);

相關文章
相關標籤/搜索