標籤:load data 主鍵 擴充 計算 不能 mil 自增列 tran 數實值型別
寫在前面的話:總是在災難發生後,才想起容災的重要性;總是在吃過虧後,才記得曾經有人提醒過。(一)核心軍規(1)不在資料庫做運算 cpu計算務必移至業務層;(2)控制單表資料量 int型不超過1000w,含char則不超過500w; 合理分表; 限制單庫表數量在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);
趕集網mysql開發36條軍規