歡迎來(lái)到深圳市志博科技有限公司網站!
您當前的(de)位置:深圳APP開發 > 新聞資訊 > APP開發資訊 >
人(rén)
已閱讀

分(fēn)享一些APP開發的(de)數據庫優化(huà)技巧

來(lái)源:lexintech.com       發布時(shí)間:2017-12-13
在APP開發中,數據庫設計對(duì)APP的(de)性能有著(zhe)非常大(dà)的(de)影(yǐng)響。今天小編總結了(le)一些數據庫優化(huà)的(de)技巧分(fēn)享給APP開發的(de)程序員(yuán)們,希望能對(duì)大(dà)家有用(yòng)。
分(fēn)享一些APP開發的(de)數據庫優化(huà)技巧
 
1.對(duì)查詢進行優化(huà),應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的(de)列上建立索引。
 
2.應盡量避免在 where 子句中使用(yòng)!=或<>操作符,否則将引擎放棄使用(yòng)索引而進行全表掃描。
 
3.應盡量避免在 where 子句中對(duì)字段進行 null 值判斷,否則将導緻引擎放棄使用(yòng)索引而進行全表掃描,如:
select id from t where num is null
可(kě)以在num上設置默認值0,确保表中num列沒有null值,然後這(zhè)樣查詢:
select id from t where num=0
 
4.應盡量避免在 where 子句中使用(yòng) or 來(lái)連接條件,否則将導緻引擎放棄使用(yòng)索引而進行全表掃描,如:
select id from t where num=10 or num=20
可(kě)以這(zhè)樣查詢:
select id from t where num=10
union all
select id from t where num=20
 
5.下(xià)面的(de)查詢也(yě)将導緻全表掃描:
select id from t where name like '%abc%'
若要提高(gāo)效率,可(kě)以考慮全文檢索。
 
6.in 和(hé) not in 也(yě)要慎用(yòng),否則會導緻全表掃描,如:
select id from t where num in(1,2,3)
對(duì)于連續的(de)數值,能用(yòng) between 就不要用(yòng) in 了(le):
select id from t where num between 1 and 3
 
7.如果在 where 子句中使用(yòng)參數,也(yě)會導緻全表掃描。因爲SQL隻有在運行時(shí)才會解析局部變量,但優化(huà)程序不能将訪問計劃的(de)選擇推遲到運行時(shí);它必須在編譯時(shí)進行選擇。然而,如果在編譯時(shí)建立訪問計劃,變量的(de)值還(hái)是未知的(de),因而無法作爲索引選擇的(de)輸入項。如下(xià)面語句将進行全表掃描:
select id from t where num=@num
可(kě)以改爲強制查詢使用(yòng)索引:
select id from t with(index(索引名)) where num=@num
 
8.應盡量避免在 where 子句中對(duì)字段進行表達式操作,這(zhè)将導緻引擎放棄使用(yòng)索引而進行全表掃描。如:
select id from t where num/2=100
應改爲:
select id from t where num=100*2
 
9.應盡量避免在where子句中對(duì)字段進行函數操作,這(zhè)将導緻引擎放棄使用(yòng)索引而進行全表掃描。如:
select id from t where substring(name,1,3)='abc'--name以abc開頭的(de)id
select id from t where datediff(day,createdate,'2005-11-30')=0--'2005-11-30'生成的(de)id
應改爲:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
 
10.不要在 where 子句中的(de)“=”左邊進行函數、算(suàn)術運算(suàn)或其他(tā)表達式運算(suàn),否則系統将可(kě)能無法正确使用(yòng)索引。
 
11.在使用(yòng)索引字段作爲條件時(shí),如果該索引是複合索引,那麽必須使用(yòng)到該索引中的(de)第一個(gè)字段作爲條件時(shí)才能保證系統使用(yòng)該索引,否則該索引将不會被使用(yòng),并且應盡可(kě)能的(de)讓字段順序與索引順序相一緻。
 
12.不要寫一些沒有意義的(de)查詢,如需要生成一個(gè)空表結構:
select col1,col2 into #t from t where 1=0
這(zhè)類代碼不會返回任何結果集,但是會消耗系統資源的(de),應改成這(zhè)樣:
create table #t(...)
 
13.很多(duō)時(shí)候用(yòng) exists 代替 in 是一個(gè)好的(de)選擇:
select num from a where num in(select num from b)
用(yòng)下(xià)面的(de)語句替換:
select num from a where exists(select 1 from b where num=a.num)
 
14.并不是所有索引對(duì)查詢都有效,SQL是根據表中數據來(lái)進行查詢優化(huà)的(de),當索引列有大(dà)量數據重複時(shí),SQL查詢可(kě)能不會去利用(yòng)索引,如一表中有字段sex,male、female幾乎各一半,那麽即使在sex上建了(le)索引也(yě)對(duì)查詢效率起不了(le)作用(yòng)。
 
15.索引并不是越多(duō)越好,索引固然可(kě)以提高(gāo)相應的(de) select 的(de)效率,但同時(shí)也(yě)降低了(le) insert 及 update 的(de)效率,因爲 insert 或 update 時(shí)有可(kě)能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個(gè)表的(de)索引數最好不要超過6個(gè),若太多(duō)則應考慮一些不常使用(yòng)到的(de)列上建的(de)索引是否有必要。
APP開發 網站開發 産品設計 微信公衆号 APP開發公司 用(yòng)戶體驗 APP運營 微信小程序 産品經理(lǐ) 網站設計