更新時(shí)間:2020-01-16 11:01:31 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2442次
隨著產(chǎn)品的推廣 、業(yè)務(wù)場(chǎng)景的復(fù)雜和使用用戶(hù)越來(lái)越多 數(shù)據(jù)會(huì)呈現(xiàn)快速增長(zhǎng)。當(dāng)數(shù)據(jù)達(dá)到千萬(wàn)級(jí)的時(shí)候 就會(huì)發(fā)現(xiàn) 查詢(xún)速度越來(lái)越慢 用戶(hù)體驗(yàn)也就越來(lái)越差,那怎樣提升千萬(wàn)級(jí)數(shù)據(jù)查詢(xún)效率呢?
優(yōu)化數(shù)據(jù)庫(kù)設(shè)計(jì):
數(shù)據(jù)字段類(lèi)型使用varchar/nvarchar 替換 char/nchar,變長(zhǎng)字段存儲(chǔ)空間小,節(jié)省存儲(chǔ)空間。在查詢(xún)的時(shí)候小的空間字段搜索效率更高。
查詢(xún)的時(shí)候避免全表掃描,可以在where和order by 的字段上建立索引。
where 查詢(xún)子句中不對(duì)null值做判斷,會(huì)導(dǎo)致檢索引擎放棄使用索引而使用全表掃描,如:select id,name from user where age is null 可以設(shè)置age 的默認(rèn)值為0,保證沒(méi)有null值,修改后的sql查詢(xún)語(yǔ)句為:select id,name from user where age = 0。
謹(jǐn)慎使用索引,索引不是越多越好。一般一張表的索引數(shù)不要超過(guò)6個(gè),如果太多要討論業(yè)務(wù)是否合理或者是否索引建在了不常用的字段上。索引可以提高select 查詢(xún)的效率,但是也響應(yīng)降低了 insert和update 的效率,因?yàn)樵趫?zhí)行insert和update時(shí)也可能會(huì)重建索引。
盡量不要更新索引數(shù)據(jù),因?yàn)樗饕龜?shù)據(jù)的順序是表記錄的物理順序,一旦發(fā)生改變將會(huì)導(dǎo)致整個(gè)表記的順序發(fā)生改變,將會(huì)消耗大量資源。如果業(yè)務(wù)需要頻繁更新索引數(shù)據(jù)列 就要考慮索引是否創(chuàng)建合理,比如 用戶(hù)ID、身份證號(hào)碼或者手機(jī)號(hào)碼不經(jīng)常改變的列可以考慮創(chuàng)建索引。
字符型字段如果符合業(yè)務(wù)需求可以修改為數(shù)字類(lèi)型字段,因?yàn)樽址妥侄螘?huì)降低查詢(xún)和連接的性能,并且增加存儲(chǔ)的開(kāi)銷(xiāo)。執(zhí)行搜索的適合查詢(xún)和連接會(huì)逐個(gè)比較字符串的每一個(gè)字符,如果是數(shù)據(jù)類(lèi)型比對(duì)一次就可以了。
SQL查詢(xún)優(yōu)化
where 查詢(xún)語(yǔ)句中避免使用**!= 或<> **操作符,搜索引擎會(huì)執(zhí)行全表掃描而不執(zhí)行創(chuàng)建的索引。
where 查詢(xún)語(yǔ)句中 避免使用 or 來(lái)連接條件查詢(xún)數(shù)據(jù),也會(huì)導(dǎo)致搜索引擎執(zhí)行全表掃描而不執(zhí)行創(chuàng)建的索引,例如:select id,name from user where age = 18 or age = 25 可以修改為 select id,name from user where age = 18 union all select id,name from user where age = 25。
** in 和 not in也避免使用,也將導(dǎo)致全表掃描,例如:select id,name from user where age in (18,19,20)** 如果是連續(xù)的則可以考慮使用between and,例如:select id,name from user where age between 18 and 20。
like 語(yǔ)句導(dǎo)致全表掃描,例如:select id,name from user where name like ‘%微信%’。
wehre 查詢(xún)語(yǔ)句中避免使用參數(shù),也會(huì)全表掃描,SQL在運(yùn)行時(shí)才會(huì)進(jìn)行局部變量的解析,優(yōu)化程序不能將訪問(wèn)計(jì)劃的選擇推遲到運(yùn)行時(shí);它必須在編譯時(shí)進(jìn)行選擇。如果編譯時(shí)建立訪問(wèn)計(jì)劃,變量的值還是未知的,因而無(wú)法作為索引選擇的輸入項(xiàng)。如下面語(yǔ)句將進(jìn)行全表掃描:select id,name from user where age = @age 當(dāng)然也可以改為強(qiáng)制使用索引:select id,name from user with(index(索引名)) where age =@ age
where查詢(xún)語(yǔ)句避免使用表達(dá)式,也會(huì)導(dǎo)致查詢(xún)的時(shí)候放棄使用索引導(dǎo)致全表掃描。例select id,name from user where age/2 = 10 ** 可以更改為 ** select id,name from user where age = 102*。
where查詢(xún)語(yǔ)句避免使用函數(shù)操作,也會(huì)導(dǎo)致查詢(xún)的時(shí)候放棄使用索引導(dǎo)致全表掃描。例如:select id,name from user where substring(name,1,3)=’abc’ 可以改為select id,name from user where name like ‘a(chǎn)bc%’。
不要使用select * from user 查詢(xún),要用具體的字段名。不要返回任何用不到的字段。
不要使用游標(biāo),大家都知道游標(biāo)的效率非常差。
避免出現(xiàn)大實(shí)務(wù)業(yè)務(wù),會(huì)降低系統(tǒng)的并發(fā)能力。
Java后臺(tái)優(yōu)化
使用JDBC連接數(shù)據(jù)庫(kù)。
合理使用數(shù)據(jù)緩存。
控制好內(nèi)存,不要全部數(shù)據(jù)放到內(nèi)出做處理,可以邊讀邊處理。
少創(chuàng)造對(duì)象。
數(shù)據(jù)庫(kù)性能優(yōu)化
使用存儲(chǔ)過(guò)程 如果在具體業(yè)務(wù)實(shí)現(xiàn)過(guò)程中,可以使用存儲(chǔ)過(guò)程操作數(shù)據(jù)庫(kù)可以盡量使用,由于存儲(chǔ)過(guò)程是存放在數(shù)據(jù)庫(kù)服務(wù)器上的一次性被設(shè)計(jì)、編碼、測(cè)試,被再次調(diào)用,需要執(zhí)行該存儲(chǔ)過(guò)程可以很簡(jiǎn)單的使用。可以提高響應(yīng)速度,減少網(wǎng)絡(luò)使用流量等等。
硬件調(diào)整 影響數(shù)據(jù)庫(kù)性能的也可能是磁盤(pán)和網(wǎng)絡(luò)吞吐量,可以通過(guò)擴(kuò)大虛擬內(nèi)存,把數(shù)據(jù)庫(kù)服務(wù)器和主服務(wù)器分開(kāi)部署。數(shù)據(jù)服務(wù)器吞吐量調(diào)為最大。
調(diào)整數(shù)據(jù)庫(kù) 如果在實(shí)際業(yè)務(wù)實(shí)現(xiàn)中對(duì)表查詢(xún)頻率過(guò)高,可以對(duì)表創(chuàng)建索引;按照where查詢(xún)條件建立索引,盡量為整型鍵建立為有且只有一個(gè)簇集索引,數(shù)據(jù)在物理上按順序在數(shù)據(jù)頁(yè)上,縮短查找范圍,為在查詢(xún)經(jīng)常使用的全部列建立非簇集索引,能最大地覆蓋查詢(xún);但是索引不可太多,執(zhí)行UPDATE DELETE INSERT語(yǔ)句需要用于維護(hù)這些索引的開(kāi)銷(xiāo)量急劇增加;避免在索引中有太多的索引鍵;避免使用大型數(shù)據(jù)類(lèi)型的列為索引;保證每個(gè)索引鍵值有少數(shù)行。
數(shù)據(jù)庫(kù)相關(guān)視頻教程
oracle數(shù)據(jù)庫(kù)教程:http://www.ilovecolors.com.cn/v22/
數(shù)據(jù)庫(kù)plsql教程:http://www.ilovecolors.com.cn/v23/
jdbc數(shù)據(jù)庫(kù)教程:http://www.ilovecolors.com.cn/v24/
數(shù)據(jù)庫(kù)mysql教程:http://www.ilovecolors.com.cn/v21
Java實(shí)戰(zhàn)項(xiàng)目視頻之egov項(xiàng)目視頻教程【免費(fèi)下載】:http://www.ilovecolors.com.cn/v83/
Java學(xué)生成績(jī)管理系統(tǒng)視頻教程【免費(fèi)下載】:http://www.ilovecolors.com.cn/v51/
以上就是動(dòng)力節(jié)點(diǎn)Java培訓(xùn)機(jī)構(gòu)小編介紹的“Java數(shù)據(jù)庫(kù)實(shí)戰(zhàn)視頻,數(shù)據(jù)庫(kù)查詢(xún)效率”的內(nèi)容,希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢(xún),有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)內(nèi)容
Java編程學(xué)習(xí):MySQL數(shù)據(jù)庫(kù)的學(xué)習(xí)路線
2020年Java數(shù)據(jù)庫(kù)筆試題大全
Java數(shù)據(jù)庫(kù)入門(mén)學(xué)習(xí),mysql書(shū)籍推薦
學(xué)習(xí)Java數(shù)據(jù)庫(kù)增刪查改通用方法
Java學(xué)習(xí):數(shù)據(jù)庫(kù)學(xué)習(xí)條件查詢(xún)和排序
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743