核心
(1)不在資料庫做運算cpu計算務必移至業務層
(2)控制單錶資料量:單錶記錄控制在1000w
(3)控制列數量:字段數控制在20以內
(4)平衡正規化與冗餘:為提高效率犧牲正規化設計,冗餘資料
(5)拒絕3b:拒絕大sql,大事物,大批量
欄位類(1)用好數值型別
tinyint(1byte)
smallint(2byte)
mediumint(3byte)
int(4byte)
bigint(8byte)
bad case:int(1)/int(11)
(2)字元轉化為數字
用int而不是char(15)儲存ip
(3)優先使用enum或set
例如:`***` enum (『f』, 『m』)
(4)避免使用null欄位
null欄位很難查詢優化
null欄位的索引需要額外空間
null欄位的復合索引無效
bad case:
`name` char(32) default null
`age` int not null
good case:
`age` int not null default 0
(5)少用text/blob
varchar的效能會比text高很多
實在避免不了blob,請拆表
(6)不在資料庫裡存
索引類(1)謹慎合理使用索引
改善查詢、減慢更新
索引一定不是越多越好(能不加就不加,要加的一定得加)
覆蓋記錄條數過多不適合建索引,例如「性別」
(2)字元字段必須建字首索引
(3)不在索引做列運算
bad case:
select id where age +1 = 10;
(4)innodb主鍵推薦使用自增列
主鍵建立聚簇索引
主鍵不應該被修改
字串不應該做主鍵
如果不指定主鍵,innodb會使用唯一且非空值索引代替
(5)不用外來鍵
請由程式保證約束
sql類
(1)sql語句盡可能簡單
一條sql只能在乙個cpu運算
大語句拆小語句,減少鎖時間
一條大sql可以堵死整個庫
(2)簡單的事務
事務時間盡可能短
bad case:
上傳事務
(3)避免使用trig/func
觸發器、函式不用
客戶端程式取而代之
(4)不用select *
消耗cpu,io,記憶體,頻寬
這種程式不具有擴充套件性
(5)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′);
(6)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』
(7)避免負向%
(8)慎用count(*)
(9)limit高效分頁
limit越大,效率越低
select id from t limit 10000, 10;
select id from t where id > 10000 limit 10;
(10)使用union all替代union
union有去重開銷
(11)少用連線join
(12)使用group by
分組自動排序
(13)請使用同型別比較
(14)使用load data導資料
load data比insert快約20倍;
(15)打散批量更新
資料庫設計,建議規範
1 資料庫和表取名要有意義,最好不要超過32字元,命名都使用小寫字母或單詞並用下劃線隔開,字段最好不要有關鍵字等 2 臨時資料建議以tmp 為字首並以日期為字尾,備份資料建議以bak 為字首並以日期為字尾 3 資料庫和表的字符集統一使用utf8 表情用utfmb4 4 表和字段都要新增注釋 5 儲存...
資料庫優化相關建議
一 資料庫優化 建表 create table user id int not null,name varchar 200 ip int engine innodb default charset utf8 1.選擇合適的字段型別,比如使用者狀態選擇tinyint,因為tinyint占用乙個位元組 ...
資料庫 規範
使用一致的 敘述性的名稱。靈活使用空格和縮進來增強可讀性。儲存符合iso 8601標準的日期格式 yyyy mm dd hh mm ss.sssss 最好使用標準sql函式而不是特定 商的函式以提高可移植性。保證 簡潔明瞭並消除多餘的sql 比如非必要的引號或括號,或者可以推導出的多餘where語句...