下面我來(lái)說(shuō)一下,有關(guān)在mysql上最實(shí)用的”軍規(guī)”,希望大家都能夠牢記遵守
一、核心軍規(guī)
? ? ? ? –?不在數(shù)據(jù)庫(kù)做運(yùn)算:cpu計(jì)算務(wù)必移至業(yè)務(wù)層
? ? ? ? –?控制單表數(shù)據(jù)量:?jiǎn)伪碛涗浛刂圃?000w
? ? ? ? –?控制列數(shù)量:字段數(shù)控制在20以內(nèi)
? ? ? ? –?平衡范式與冗余:為提高效率犧牲范式設(shè)計(jì),冗余數(shù)據(jù)
? ? ? ? –?拒絕3B:拒絕大sql,大事物,大批量
二、字段類軍規(guī)
? ? ? ? – 用好數(shù)值類型
? ? ? ? ? ? tinyint(1Byte)
? ? ? ? ? ? smallint(2Byte)
? ? ? ? ? ? mediumint(3Byte)
? ? ? ? ? ? int(4Byte)
? ? ? ? ? ? bigint(8Byte)
? ? ? ? ? ? bad case:int(1)/int(11)
? ? ? ? – 字符轉(zhuǎn)化為數(shù)字
? ? ? ? ? ? 用int而不是char(15)存儲(chǔ)ip
? ? ? ? – 避免使用NULL字段
? ? ? ? ? ? NULL字段很難數(shù)值類型優(yōu)化
? ? ? ? ? ? NULL字段的數(shù)值類型需要額外空間
? ? ? ? ? ? NULL字段的復(fù)合索引無(wú)效
? ? ? ? – 少用text/blob
? ? ? ? ? ? varchar的性能會(huì)比text高很多
? ? ? ? ? ? 實(shí)在避免不了blob,請(qǐng)拆表
? ? ? ? – 不在數(shù)據(jù)庫(kù)里存數(shù)值類型
三、索引類軍規(guī)
? ? ? ? – 謹(jǐn)慎合理使用索引
? ? ? ? ? ? 改善查詢、減慢數(shù)值類型
? ? ? ? ? ? 索引一定不是越多越好(能不加就不加,要加的一定得加)
? ? ? ? ? ? 覆蓋記錄條數(shù)過(guò)多不適合建索引,例如“性別”
? ? ? ? – 字符字段必須建前綴索引
? ? ? ? – 不在索引做列運(yùn)算
? ? ? ? ? ? bad case:
? ? ? ? ? ? select id where age +1 = 10;
? ? ? ? – innodb主鍵推薦使用自增列
? ? ? ? ? ? 主鍵建立聚簇索引
? ? ? ? ? ? 主鍵不應(yīng)該被修改
? ? ? ? ? ? 數(shù)值類型不應(yīng)該做主鍵
? ? ? ? ? ? 如果不指定主鍵,innodb會(huì)使用唯一且非空值索引代替
? ? ? ? – 不用外鍵
? ? ? ? ? ? 請(qǐng)由程序保證數(shù)值類型
四、sql類軍規(guī)
? ? ? ? – sql語(yǔ)句盡可能簡(jiǎn)單
? ? ? ? ? ? 一條sql只能在一個(gè)cpu運(yùn)算
? ? ? ? ? ? 大語(yǔ)句拆小語(yǔ)句,減少鎖時(shí)間
? ? ? ? ? ? 一條大sql可以堵死整個(gè)庫(kù)
? ? ? ? – 簡(jiǎn)單的事務(wù)
? ? ? ? ? ? 事務(wù)時(shí)間盡可能短
? ? ? ? ? ? bad case:
? ? ? ? ? ? 上傳圖片事務(wù)
? ? ? ? – 避免使用trig/func
? ? ? ? ? ? 數(shù)值類型、函數(shù)不用
? ? ? ? ? ? 客戶端程序取而代之
上面是我整理給大家的mysql“軍規(guī)”,希望今后會(huì)對(duì)大家有幫助。
相關(guān)文章: