1.SQL語句優(yōu)化
1)應(yīng)盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進(jìn)行全表掃描。
2)應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行 null 值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:
select id from t where num is null
可以在num上設(shè)置默認(rèn)值0,確保表中num列沒有null值,然后這樣查詢:
select id from t where num=0
3)很多時(shí)候用 exists 代替 in 是一個(gè)好的選擇
4)用Where子句替換HAVING 子句 因?yàn)镠AVING 只會(huì)在檢索出所有記錄之后才對(duì)結(jié)果集進(jìn)行過濾
2.數(shù)據(jù)庫結(jié)構(gòu)優(yōu)化
1)范式優(yōu)化: 比如消除冗余(節(jié)省空間。。) 2)反范式優(yōu)化:比如適當(dāng)加冗余等(減少join) 3)拆分表: 分區(qū)將數(shù)據(jù)在物理上分隔開,不同分區(qū)的數(shù)據(jù)可以制定保存在處于不同磁盤上的數(shù)據(jù)文件里。這樣,當(dāng)對(duì)這個(gè)表進(jìn)行查詢時(shí),只需要在表分區(qū)中進(jìn)行掃描,而不必進(jìn)行全表掃描,明顯縮短了查詢時(shí)間,另外處于不同磁盤的分區(qū)也將對(duì)這個(gè)表的數(shù)據(jù)傳輸分散在不同的磁盤I/O,一個(gè)精心設(shè)置的分區(qū)可以將數(shù)據(jù)傳輸對(duì)磁盤I/O競爭均勻地分散開。對(duì)數(shù)據(jù)量大的時(shí)時(shí)表可采取此方法??砂丛伦詣?dòng)建表分區(qū)。
4)拆分其實(shí)又分垂直拆分和水平拆分: 案例: 簡單購物系統(tǒng)暫設(shè)涉及如下表: 1.產(chǎn)品表(數(shù)據(jù)量10w,穩(wěn)定) 2.訂單表(數(shù)據(jù)量200w,且有增長趨勢) 3.用戶表 (數(shù)據(jù)量100w,且有增長趨勢) 以mysql為例講述下水平拆分和垂直拆分,mysql能容忍的數(shù)量級(jí)在百萬靜態(tài)數(shù)據(jù)可以到千萬 垂直拆分:解決問題:表與表之間的io競爭 不解決問題:單表中數(shù)據(jù)量增長出現(xiàn)的壓力 方案: 把產(chǎn)品表和用戶表放到一個(gè)server上 訂單表單獨(dú)放到一個(gè)server上 水平拆分: 解決問題:單表中數(shù)據(jù)量增長出現(xiàn)的壓力 不解決問題:表與表之間的io爭奪
方案: 用戶表通過性別拆分為男用戶表和女用戶表 訂單表通過已完成和完成中拆分為已完成訂單和未完成訂單 產(chǎn)品表 未完成訂單放一個(gè)server上 已完成訂單表盒男用戶表放一個(gè)server上 女用戶表放一個(gè)server上(女的愛購物 哈哈)








暫無數(shù)據(jù)