高頻后端服務(wù)面試試題及答案_第1頁(yè)
高頻后端服務(wù)面試試題及答案_第2頁(yè)
高頻后端服務(wù)面試試題及答案_第3頁(yè)
高頻后端服務(wù)面試試題及答案_第4頁(yè)
高頻后端服務(wù)面試試題及答案_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

高頻后端服務(wù)面試試題及答案1.線程池的核心參數(shù)有哪些?生產(chǎn)環(huán)境中如何合理配置?線程池的核心參數(shù)包括:corePoolSize(核心線程數(shù))、maximumPoolSize(最大線程數(shù))、keepAliveTime(非核心線程空閑存活時(shí)間)、unit(時(shí)間單位)、workQueue(任務(wù)隊(duì)列)、threadFactory(線程工廠)、handler(拒絕策略)。核心線程數(shù)決定了線程池的基礎(chǔ)處理能力,通常根據(jù)任務(wù)類型(CPU密集型/IO密集型)設(shè)置:CPU密集型建議設(shè)為CPU核心數(shù)+1,避免上下文切換;IO密集型因線程常阻塞,可設(shè)為CPU核心數(shù)×2或更高。最大線程數(shù)需結(jié)合任務(wù)峰值負(fù)載,若隊(duì)列已滿且核心線程全忙,會(huì)創(chuàng)建非核心線程處理,需避免設(shè)置過大導(dǎo)致資源耗盡。任務(wù)隊(duì)列常用有界隊(duì)列(如ArrayBlockingQueue),防止無界隊(duì)列(如LinkedBlockingQueue)導(dǎo)致OOM。拒絕策略需根據(jù)業(yè)務(wù)容忍度選擇:AbortPolicy(直接拋異常,適合關(guān)鍵任務(wù))、CallerRunsPolicy(調(diào)用者執(zhí)行,降低提交速度)、DiscardPolicy(丟棄新任務(wù))、DiscardOldestPolicy(丟棄最舊任務(wù))。生產(chǎn)中需結(jié)合壓測(cè)數(shù)據(jù)調(diào)整,例如電商大促時(shí)可動(dòng)態(tài)調(diào)整最大線程數(shù),配合監(jiān)控(如線程池活躍度、隊(duì)列積壓量)做彈性擴(kuò)縮。2.如何解決Java中多線程的可見性和有序性問題?可見性問題源于各線程本地緩存與主存的不一致,有序性問題源于編譯器/CPU的指令重排序。Java內(nèi)存模型(JMM)通過happens-before規(guī)則定義可見性約束,并提供volatile、synchronized、Lock等機(jī)制。volatile關(guān)鍵字通過內(nèi)存屏障(LoadStore/StoreLoad)禁止特定重排序,且寫操作立即刷新主存,讀操作強(qiáng)制從主存讀取,保證可見性和部分有序性(僅保證變量自身的有序,不保證代碼塊整體)。synchronized通過MonitorEnter/MonitorExit指令,在進(jìn)入同步塊時(shí)清空本地緩存,退出時(shí)刷新主存,保證原子性、可見性和有序性(同步塊內(nèi)代碼視為一個(gè)整體,禁止與塊外代碼重排序)。Lock(如ReentrantLock)基于AQS實(shí)現(xiàn),通過unlock時(shí)釋放鎖(喚醒等待線程)和lock時(shí)獲取鎖(強(qiáng)制從主存讀?。瑯颖WC可見性。實(shí)際開發(fā)中,若變量是狀態(tài)標(biāo)志(如線程終止標(biāo)志),用volatile更輕量;若涉及復(fù)合操作(如i++),需用synchronized或Atomic類(基于CAS)保證原子性。3.說說AQS(AbstractQueuedSynchronizer)的核心原理和設(shè)計(jì)模式?AQS是Java并發(fā)包的基礎(chǔ)同步框架,通過維護(hù)一個(gè)volatileintstate(同步狀態(tài))和一個(gè)CLH變體的雙向同步隊(duì)列(存儲(chǔ)等待線程)實(shí)現(xiàn)鎖機(jī)制。核心方法包括acquire(獲取鎖)、release(釋放鎖)、acquireShared(共享鎖獲?。eleaseShared(共享鎖釋放)。獨(dú)占模式(如ReentrantLock):線程嘗試通過tryAcquire(需子類實(shí)現(xiàn))修改state,成功則獲取鎖;失敗則封裝為Node(包含線程、等待狀態(tài))加入隊(duì)列尾部,通過park()阻塞,直到前驅(qū)節(jié)點(diǎn)釋放鎖時(shí)被unpark()喚醒。共享模式(如CountDownLatch):tryAcquireShared返回值>0表示可獲取,否則入隊(duì)等待,釋放時(shí)通過doReleaseShared喚醒后續(xù)節(jié)點(diǎn)。AQS使用模板方法模式,將通用流程(如入隊(duì)、阻塞)封裝在基類,將具體狀態(tài)變更邏輯(tryAcquire/tryRelease)留給子類實(shí)現(xiàn),提高擴(kuò)展性。例如ReentrantLock的NonfairSync子類重寫tryAcquire,實(shí)現(xiàn)非公平鎖的搶占邏輯;CountDownLatch的Sync子類重寫tryAcquireShared,根據(jù)state是否為0判斷是否放行。4.MySQL索引失效的常見場(chǎng)景有哪些?如何避免?索引失效場(chǎng)景包括:模糊查詢以通配符開頭(如LIKE'%abc'):無法使用前綴索引,需改用全文索引或調(diào)整查詢方式(如反向存儲(chǔ)+反向索引)。類型隱式轉(zhuǎn)換:如字段為varchar卻用數(shù)字查詢(WHEREphone,會(huì)觸發(fā)全表掃描,需保持查詢條件與字段類型一致。復(fù)合索引未遵循最左匹配原則:如索引(a,b,c),查詢條件無a(如WHEREb=1)或跳過a直接用b、c(如WHEREa=1ANDc=1),無法使用索引。使用函數(shù)或表達(dá)式操作索引列:如WHEREYEAR(create_time)=2023,會(huì)先對(duì)整列計(jì)算YEAR再比較,需改為范圍查詢(create_time>='2023-01-01'ANDcreate_time<'2024-01-01')。索引列參與邏輯運(yùn)算(如>、<)且數(shù)據(jù)分布不均:若某列90%的值為NULL,對(duì)該列的ISNOTNULL查詢可能因優(yōu)化器認(rèn)為全表掃描更高效而放棄索引。避免方法:通過EXPLAIN分析執(zhí)行計(jì)劃,檢查key字段是否為NULL;設(shè)計(jì)復(fù)合索引時(shí)按查詢頻率和區(qū)分度排序(高頻、高區(qū)分度在前);避免對(duì)索引列做計(jì)算或類型轉(zhuǎn)換;對(duì)于模糊查詢,若必須左匹配,可使用覆蓋索引(如索引(col)并查詢SELECTcolWHEREcolLIKE'abc%')。5.事務(wù)的隔離級(jí)別有哪些?各自解決什么問題?SQL標(biāo)準(zhǔn)定義了4種隔離級(jí)別,從低到高:讀未提交(ReadUncommitted):允許讀取其他事務(wù)未提交的修改,會(huì)導(dǎo)致臟讀(讀取到回滾的數(shù)據(jù))。讀已提交(ReadCommitted,RC):僅讀取已提交的數(shù)據(jù),解決臟讀,但可能出現(xiàn)不可重復(fù)讀(同一事務(wù)兩次查詢結(jié)果不同)??芍貜?fù)讀(RepeatableRead,RR,MySQL默認(rèn)):保證同一事務(wù)內(nèi)多次查詢結(jié)果一致,通過MVCC(多版本并發(fā)控制)的快照讀實(shí)現(xiàn),解決不可重復(fù)讀,但可能出現(xiàn)幻讀(查詢范圍新增數(shù)據(jù))。MySQL通過間隙鎖(GapLock)+行鎖(RecordLock)的Next-KeyLock機(jī)制,在RR級(jí)別下可避免幻讀。串行化(Serializable):事務(wù)串行執(zhí)行,通過鎖表實(shí)現(xiàn),解決所有并發(fā)問題,但性能最差。實(shí)際應(yīng)用中,RC和RR最常用。RC適合對(duì)一致性要求不高但需高并發(fā)的場(chǎng)景(如日志系統(tǒng));RR適合金融等需要強(qiáng)一致性的場(chǎng)景(如賬戶余額查詢)。需注意MySQL的RR級(jí)別通過MVCC和Next-KeyLock實(shí)現(xiàn),而Oracle的默認(rèn)隔離級(jí)別是RC,僅通過語(yǔ)句級(jí)快照避免不可重復(fù)讀。6.Redis的持久化機(jī)制有哪些?各自優(yōu)缺點(diǎn)及生產(chǎn)環(huán)境如何選擇?Redis提供RDB(快照持久化)和AOF(日志追加持久化),以及4.0版本引入的混合持久化(RDB+AOF)。RDB:通過bgsave命令(fork子進(jìn)程)將當(dāng)前內(nèi)存數(shù)據(jù)快照寫入磁盤。優(yōu)點(diǎn)是文件緊湊(二進(jìn)制格式)、恢復(fù)快;缺點(diǎn)是實(shí)時(shí)性差(默認(rèn)每5分鐘或1萬次寫操作觸發(fā)),可能丟失最后一次快照后的所有數(shù)據(jù)。AOF:記錄所有寫操作命令(追加到aof文件),通過rewrite機(jī)制壓縮冗余命令(如多次incr合并為set)。優(yōu)點(diǎn)是數(shù)據(jù)完整性高(可配置每秒fsync,最多丟失1秒數(shù)據(jù));缺點(diǎn)是文件體積大、恢復(fù)速度慢(需重放所有命令)。混合持久化:AOF重寫時(shí),將重寫時(shí)刻的RDB快照和后續(xù)增量命令(AOF格式)寫入新文件。兼顧RDB的緊湊和AOF的實(shí)時(shí)性,恢復(fù)時(shí)先加載RDB快照,再重放增量命令。生產(chǎn)環(huán)境選擇:若允許少量數(shù)據(jù)丟失(如緩存場(chǎng)景),可僅用RDB(配置合理的快照頻率);若需要高數(shù)據(jù)完整性(如會(huì)話存儲(chǔ)),建議啟用AOF(appendfsynceverysec)并開啟混合持久化;高并發(fā)場(chǎng)景需監(jiān)控AOF文件大?。ū苊膺^大影響rewrite性能),可通過auto-aof-rewrite-percentage(超過上次重寫后大小的100%觸發(fā))和auto-aof-rewrite-min-size(最小重寫文件大?。﹥?yōu)化。7.如何解決Redis緩存擊穿、穿透、雪崩問題?緩存擊穿:熱點(diǎn)key過期時(shí),大量請(qǐng)求同時(shí)查詢DB,導(dǎo)致DB壓力驟增。解決方法:①熱點(diǎn)key設(shè)置永不過期(邏輯過期,通過異步線程更新);②使用互斥鎖(如Redis的setnx),僅允許一個(gè)線程查詢DB并更新緩存,其他線程等待;③提前更新(監(jiān)控?zé)狳c(diǎn)key,在過期前主動(dòng)刷新)。緩存穿透:查詢不存在的數(shù)據(jù)(如id=-1),導(dǎo)致請(qǐng)求直接打到DB。解決方法:①緩存空值(查詢DB無結(jié)果時(shí),緩存null并設(shè)置短過期時(shí)間);②布隆過濾器(預(yù)先將所有可能的key存入布隆過濾器,查詢前檢查是否存在,不存在則直接返回);③參數(shù)校驗(yàn)(過濾非法請(qǐng)求,如id<0)。緩存雪崩:大量key同時(shí)過期或Redis宕機(jī),導(dǎo)致請(qǐng)求集中涌入DB。解決方法:①分散過期時(shí)間(為key的過期時(shí)間添加隨機(jī)值,避免集中失效);②多級(jí)緩存(本地緩存+Redis,減輕Redis壓力);③限流降級(jí)(通過Hystrix等組件限制DB請(qǐng)求,保護(hù)核心服務(wù));④高可用架構(gòu)(Redis集群+哨兵,避免單點(diǎn)故障)。8.消息隊(duì)列(如Kafka)如何保證消息不丟失?消息丟失可能發(fā)生在生產(chǎn)者、Broker、消費(fèi)者三個(gè)環(huán)節(jié):生產(chǎn)者丟失:發(fā)送消息未確認(rèn)。解決:Kafka生產(chǎn)者設(shè)置acks=all(所有ISR副本確認(rèn)),并開啟重試(retries=Integer.MAX_VALUE);RabbitMQ啟用發(fā)布確認(rèn)(publisherconfirm)和返回機(jī)制(returncallback)。Broker丟失:消息未持久化或節(jié)點(diǎn)宕機(jī)。解決:Kafka設(shè)置min.insync.replicas≥2(至少2個(gè)同步副本),并啟用unclean.leader.election.enable=false(禁止非ISR節(jié)點(diǎn)成為leader,避免數(shù)據(jù)丟失);RabbitMQ設(shè)置durable=true(隊(duì)列和消息持久化),鏡像隊(duì)列(多副本)。消費(fèi)者丟失:未處理完消息就確認(rèn)。解決:Kafka關(guān)閉自動(dòng)提交(mit=false),手動(dòng)提交offset(處理完消息后調(diào)用commitSync());RabbitMQ關(guān)閉自動(dòng)ACK(autoAck=false),處理成功后調(diào)用channel.basicAck(),失敗時(shí)根據(jù)情況reject或nack(重新入隊(duì))。生產(chǎn)中需結(jié)合監(jiān)控(如Kafka的ConsumerLag),確保消費(fèi)進(jìn)度正常;同時(shí),關(guān)鍵消息可通過事務(wù)或消息表(記錄消息狀態(tài))做補(bǔ)償(如定時(shí)掃描未確認(rèn)消息重新發(fā)送)。9.如何設(shè)計(jì)一個(gè)高并發(fā)的接口?需要考慮哪些方面?高并發(fā)接口設(shè)計(jì)需從限流、緩存、異步、降級(jí)、數(shù)據(jù)庫(kù)優(yōu)化等多維度入手:限流:防止過多請(qǐng)求壓垮服務(wù)。常用算法有令牌桶(TokenBucket,限制平均速率)、漏桶(LeakyBucket,限制突發(fā)流量)、滑動(dòng)窗口(更精確控制時(shí)間段內(nèi)的請(qǐng)求數(shù))。實(shí)現(xiàn)方式:Nginx層限流(limit_req_zone)、網(wǎng)關(guān)層(SpringCloudGateway的RequestRateLimiter)、應(yīng)用層(GuavaRateLimiter)。緩存:減少DB訪問。熱點(diǎn)數(shù)據(jù)提前加載到Redis,使用本地緩存(Caffeine)緩存高頻小數(shù)據(jù);緩存失效時(shí)通過互斥鎖或異步加載避免緩存擊穿。異步:將非核心操作(如日志記錄、消息通知)通過消息隊(duì)列(Kafka/RabbitMQ)異步處理,縮短接口響應(yīng)時(shí)間。降級(jí):當(dāng)服務(wù)負(fù)載過高時(shí),屏蔽非關(guān)鍵功能(如返回默認(rèn)值、簡(jiǎn)化頁(yè)面),保證核心功能可用??赏ㄟ^Hystrix或Sentinel配置熔斷規(guī)則(錯(cuò)誤率≥50%時(shí)熔斷,5秒后嘗試恢復(fù))。數(shù)據(jù)庫(kù)優(yōu)化:分庫(kù)分表(按時(shí)間或ID哈希拆分)、讀寫分離(主庫(kù)寫,從庫(kù)讀)、批量操作(批量插入/更新減少IO)、索引優(yōu)化(覆蓋索引避免回表)。冪等性:防止重復(fù)提交。通過唯一ID(如訂單號(hào))+冪等表(記錄已處理的ID)實(shí)現(xiàn),接口先查詢冪等表,存在則直接返回結(jié)果。分布式鎖:控制對(duì)共享資源的訪問(如庫(kù)存扣減),使用Redis的Redisson或ZooKeeper實(shí)現(xiàn),避免超賣。例如,電商秒殺接口可設(shè)計(jì)為:前端限流(驗(yàn)證碼/按鈕防重復(fù)點(diǎn)擊)→網(wǎng)關(guān)層限流(限制IP訪問頻率)→應(yīng)用層檢查庫(kù)存(緩存中校驗(yàn))→扣減庫(kù)存(分布式鎖+DB行鎖)→異步提供訂單(消息隊(duì)列),確保在10萬QPS下仍能穩(wěn)定運(yùn)行。10.單例模式的線程安全實(shí)現(xiàn)方式有哪些?各有什么優(yōu)缺點(diǎn)?常見線程安全的單例模式實(shí)現(xiàn):餓漢式:類加載時(shí)初始化實(shí)例。```javapublicclassSingleton{privatestaticfinalSingletonINSTANCE=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returnINSTANCE;}}```優(yōu)點(diǎn):簡(jiǎn)單、線程安全(類加載機(jī)制保證);缺點(diǎn):提前初始化,可能浪費(fèi)資源(若實(shí)例使用頻率低)。懶漢式(synchronized):```javapublicclassSingleton{privatestaticSingletonINSTANCE;privateSingleton(){}publicstaticsynchronizedSingletongetInstance(){if(INSTANCE==null){INSTANCE=newSingleton();}returnINSTANCE;}}```優(yōu)點(diǎn):延遲初始化;缺點(diǎn):synchronized修飾方法,并發(fā)性能差(每次獲取實(shí)例都加鎖)。雙重檢查鎖定(DCL):```javapublicclassSingleton{privatestaticvolatileSingletonINSTANCE;//防止指令重排序privateSingleton(){}publicstaticSingletongetInstance(){if(INSTANCE==null){//第一次檢查,避免不必要的鎖synchronized(Singleton.class){if(INSTANCE==null){//第二次檢查,防止多線程同時(shí)通過第一次檢查INSTANCE=newSingleton();}}}returnINSTANCE;}}```優(yōu)點(diǎn):延遲初始化、線程安全、性能高(僅首次創(chuàng)建加鎖);缺點(diǎn):需volatile修飾INSTANCE(避免JVM指令重排序?qū)е缕渌€程獲取到未初始化的實(shí)例)。靜態(tài)內(nèi)部類:```javapublicclassSingleton{privateSingleton(){}privatestaticclassHolder{staticfinalSingletonINSTANCE=newSingleton();}publicstaticSingletongetInstance(){returnHolder.INSTANCE;}}```優(yōu)點(diǎn):利用類加載的延遲性(Holder類在第一次調(diào)用getInstance時(shí)加載),線程安全(類加載機(jī)制保證),無需加鎖;缺點(diǎn):無法傳遞參數(shù)(若單例需要參數(shù)初始化,不適用)。生產(chǎn)中推薦DCL或靜態(tài)內(nèi)部類,DCL適用于需要參數(shù)的場(chǎng)景,靜態(tài)內(nèi)部類更簡(jiǎn)潔。11.如何設(shè)計(jì)一個(gè)分布式鎖?需要考慮哪些問題?分布式鎖需滿足:互斥性(同一時(shí)刻僅一個(gè)客戶端持有)、可重入性(同一客戶端可多次加鎖)、高可用(部分節(jié)點(diǎn)宕機(jī)仍可用)、容錯(cuò)性(鎖自動(dòng)過期避免死鎖)、正確釋放(客戶端崩潰時(shí)鎖能被釋放)。常用實(shí)現(xiàn)方案:Redis(Redisson):通過set命令(setkeyvalueNXPX30000)原子操作加鎖,value設(shè)為客戶端唯一標(biāo)識(shí)(如UUID+線程ID)保證可重入(通過hash結(jié)構(gòu)記錄加鎖次數(shù));釋放時(shí)檢查value是否匹配(避免釋放其他客戶端的鎖),使用Lua腳本保證原子性(查詢+刪除)。ZooKeeper:創(chuàng)建臨時(shí)有序節(jié)點(diǎn)(/lock/seq-),客戶端監(jiān)聽前一個(gè)節(jié)點(diǎn)的刪除事件,前一個(gè)節(jié)點(diǎn)刪除則當(dāng)前節(jié)點(diǎn)獲得鎖;臨時(shí)節(jié)點(diǎn)在客戶端斷開時(shí)自動(dòng)刪除,避免死鎖。設(shè)計(jì)時(shí)需考慮:鎖過期時(shí)間:需大于業(yè)務(wù)執(zhí)行時(shí)間(如設(shè)置30秒),若業(yè)務(wù)耗時(shí)較長(zhǎng),需自動(dòng)續(xù)期(Redisson的WatchDog機(jī)制每10秒續(xù)期到30秒)。鎖的可重入:記錄客戶端標(biāo)識(shí)和加鎖次數(shù),重入時(shí)增加計(jì)數(shù),釋放時(shí)減少。避免誤刪:釋放鎖時(shí)必須驗(yàn)證持有方身份(如Redis的value匹配),防止A客戶端的鎖被B客戶端誤刪(如A執(zhí)行時(shí)間過長(zhǎng)導(dǎo)致鎖過期,B加鎖后A釋放)。集群模式:Redis主從架構(gòu)下,主節(jié)點(diǎn)宕機(jī)可能導(dǎo)致鎖丟失(未同步到從節(jié)點(diǎn)),可使用Redlock算法(向多個(gè)獨(dú)立Redis實(shí)例加鎖,多數(shù)成功則認(rèn)為加鎖成功)提高可靠性,但性能較低。12.微服務(wù)拆分的原則和常見問題有哪些?微服務(wù)拆分原則:?jiǎn)我宦氊?zé):每個(gè)服務(wù)專注一個(gè)業(yè)務(wù)功能(如用戶服務(wù)、訂單服務(wù)),避免大而全的“單體服務(wù)”。邊界清晰:通過領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)劃分限界上下文(BoundedContext),服務(wù)間通過API或消息隊(duì)列通信,避免共享數(shù)據(jù)庫(kù)。高內(nèi)聚低耦合:服務(wù)內(nèi)部邏輯高度相關(guān),服務(wù)間依賴通過接口抽象(如Feign),減少直接依賴。可獨(dú)立部署:每個(gè)服務(wù)有獨(dú)立的代碼庫(kù)、構(gòu)建流程,可單獨(dú)發(fā)布(如Docker容器化)。常見問題及解決:服務(wù)間調(diào)用復(fù)雜:引入服務(wù)網(wǎng)關(guān)(如SpringCloudGateway)統(tǒng)一路由、鑒權(quán);使用服務(wù)注冊(cè)發(fā)現(xiàn)(Eureka/Nacos)管理服務(wù)地址;通過分布式追蹤(Sleuth+Zipkin)監(jiān)控調(diào)用鏈路。數(shù)據(jù)一致性:跨服務(wù)的事務(wù)無法通過本地事務(wù)保證,需用最終一致性方案(TCC補(bǔ)償、消息事務(wù)、Saga模式)。例如,訂單服務(wù)創(chuàng)建訂單后,通過消息隊(duì)列通知庫(kù)存服務(wù)扣減庫(kù)存,若扣減失敗,訂單服務(wù)回滾(消息事務(wù)需保證消息發(fā)送和本地事務(wù)原子性)。運(yùn)維復(fù)雜度高:使用K8s進(jìn)行容器編排(自動(dòng)擴(kuò)縮容、故障恢復(fù));日志集中管理(ELK);監(jiān)控告警(Prometheus+Grafana)。接口版本兼容:API需設(shè)計(jì)成向后兼容(如添加新字段不影響舊版本),使用版本號(hào)(/api/v1/...)或內(nèi)容協(xié)商(Accept頭)管理。13.如何優(yōu)化慢SQL?具體步驟是什么??jī)?yōu)化慢SQL需結(jié)合執(zhí)行計(jì)劃和業(yè)務(wù)場(chǎng)景,步驟如下:1.定位慢SQL:通過MySQL的慢查詢?nèi)罩荆╯low_query_log)或監(jiān)控工具(如PerconaToolkit的pt-query-digest)抓取執(zhí)行時(shí)間超過閾值(如1秒)的SQL。2.分析執(zhí)行計(jì)劃:使用EXPLAIN命令查看type(訪問類型,理想為ref或eq_ref)、key(使用的索引)、rows(掃描行數(shù))、Extra(是否Usingfilesort/Usingtemporary)。3.檢查索引:缺失索引:對(duì)WHERE、JOIN、ORDERBY、GROUPBY中的列添加索引(注意復(fù)合索引的最左匹配)。冗余索引:刪除重復(fù)或包含的索引(如已有(a,b),無需單獨(dú)(a))。索引失效:避免對(duì)索引列做計(jì)算、類型轉(zhuǎn)換,優(yōu)化LIKE查詢(避免左通配符)。4.優(yōu)化查詢邏輯:避免SELECT:只查詢需要的列,減少數(shù)據(jù)傳輸和回表(若查詢列都在索引中,使用覆蓋索引)。分頁(yè)優(yōu)化:大數(shù)據(jù)量分頁(yè)(如LIMIT100000,20)時(shí),避免全表掃描,改用覆蓋索引+子查詢(如SELECTFROMtWHEREid>(SELECTidFROMtLIMIT100000,1)LIMIT20)。減少JOIN表數(shù)量:拆分為多個(gè)單表查詢(通過緩存或本地查詢),或調(diào)整表結(jié)構(gòu)(適當(dāng)冗余字段)。5.調(diào)整數(shù)據(jù)庫(kù)配置:增大innodb_buffer_pool_size(緩沖池大小,建議占內(nèi)存50%-70%),減少磁盤IO。調(diào)整innodb_flush_log_at_trx_commit(若允許少量數(shù)據(jù)丟失,設(shè)為2,提高寫性能)。6.定期維護(hù):分析表(ANALYZETABLE)更新統(tǒng)計(jì)信息,幫助優(yōu)化器選擇更優(yōu)索引。重建索引(ALTERTABLEtENGINE=InnoDB)或優(yōu)化表(OPTIMIZETABLE),減少索引碎片。例如,某慢SQL為SELECTFROMorderWHEREuser_id=123ANDstatus=1ORDERBYcreate_timeDESCLIMIT10,執(zhí)行計(jì)劃顯示type=ALL(全表掃描),rows=100000。優(yōu)化方法:添加復(fù)合索引(user_id,status,create_time)(最左匹配user_id和status,包含create_time排序),使查詢變?yōu)樗饕龗呙瑁╰ype=ref),rows=100,性能提升顯著。14.如何保證接口的冪等性?常見實(shí)現(xiàn)方式有哪些??jī)绲刃灾竿徽?qǐng)求多次調(diào)用,結(jié)果與調(diào)用一次一致。常見實(shí)現(xiàn)方式:唯一標(biāo)識(shí)(Token):客戶端提供唯一ID(如UUID),隨請(qǐng)求發(fā)送。服務(wù)端通過冪等表(如redis或DB)記錄已處理的ID,重復(fù)請(qǐng)求直接返回結(jié)果。例如,支付接口要求攜帶out_trade_no,服務(wù)端查詢?cè)撎?hào)是否已支付,已支付則返回成功。數(shù)據(jù)庫(kù)唯一約束:通過唯一索引(如訂單號(hào)、業(yè)務(wù)流水號(hào))防止重復(fù)提交。插入時(shí)若違反唯一約束,捕獲異常并返回已存在的結(jié)果。狀態(tài)機(jī):業(yè)務(wù)狀態(tài)按順序變更(如訂單狀態(tài):未支付→已支付→已發(fā)貨),僅允許從低狀態(tài)到高狀態(tài)變更。例如,重復(fù)調(diào)用“支付”接口,若訂單已支付,直接返回成功。樂觀鎖:通過版本號(hào)(version)或時(shí)間戳實(shí)現(xiàn)。更新時(shí)檢查版本號(hào),若與當(dāng)前版本一致則更新并遞增版本,否則重試或返回失敗。例如:```sqlUPDATEorderSETamount=100,ve

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論