欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

通過緩存+SQL修改優(yōu)雅地優(yōu)化慢查詢

 更新時間:2023年04月07日 08:16:47   作者:Robinbin  
本文通過介紹緩存的基本原理和SQL語句的優(yōu)化手段,以及實(shí)際案例的分析,為讀者提供了一種簡單而有效的優(yōu)化思路。讀者可以通過本文了解到如何在不修改程序代碼的情況下,通過巧妙地運(yùn)用緩存和SQL優(yōu)化技巧,提高程序的性能和響應(yīng)速度。

問題描述

單例數(shù)據(jù)庫模式中,后端高并發(fā)請求多(讀多寫少),導(dǎo)致數(shù)據(jù)庫壓力過大,關(guān)鍵接口響應(yīng)變慢,嚴(yán)重影響體驗(yàn)。

需求

減少接口的響應(yīng)時間。

尋找解決方案

由于問題主要處在數(shù)據(jù)庫壓力過大的情況,采用兩種優(yōu)化思路優(yōu)化查詢過程:

  • 使用緩存分擔(dān)數(shù)據(jù)庫壓力
  • 對查詢數(shù)據(jù)庫過程做優(yōu)化

緩存方案

更新策略

使用Redis,雖然可以很好地減少數(shù)據(jù)庫的壓力,但是同時在高并發(fā)的情況下,容易出現(xiàn)數(shù)據(jù)不一致的情況,尤其是在更新數(shù)據(jù)的時候。

最常見的導(dǎo)致不一致的原因是雙寫操作,即高并發(fā)情況下短時間內(nèi)對數(shù)據(jù)庫進(jìn)行兩次寫操作。為了最小程度地出現(xiàn)這種情況,緩存在更新策略上采用先更新數(shù)據(jù)庫后刪除緩存的方式。

對于雙寫問題,在最壞情況下,寫請求A在更新數(shù)據(jù)庫后,被寫請求B先一步更新數(shù)據(jù)庫+刪除緩存,然后A請求才刪除緩存,也不會導(dǎo)致后續(xù)請求讀取到錯誤的值。

對于先寫后讀,在最壞情況下,寫請求A在更新數(shù)據(jù)庫后,被讀請求C先一步在緩存讀取到舊值,然后A請求才刪除緩存,也只會影響這段時間的讀請求,刪除后的讀請求不影響。

對比其他方案(先更新緩存后更新數(shù)據(jù)庫、先刪除緩存后更新數(shù)據(jù)庫、先更新數(shù)據(jù)庫后更新緩存)在最壞情況下會導(dǎo)致的錯誤(更新數(shù)據(jù)庫失敗導(dǎo)致緩存是未知值、雙寫后數(shù)據(jù)庫變成舊值、更新緩存失敗導(dǎo)致緩存保存舊值)要好得多。

但是先更新數(shù)據(jù)庫后刪除緩存也不是完全安全的,除了上文提到的高并發(fā)下先寫后讀可能讀到舊值外,若刪除緩存失敗,也有可能導(dǎo)致讀到舊值。處理方法見下文。

緩存架構(gòu)

添加緩存,勢必要修改業(yè)務(wù)代碼,如何配置架構(gòu)才能把對代碼的入侵性講到最低,這里使用監(jiān)聽數(shù)據(jù)庫binlog的方法,使用中間件監(jiān)聽mysql的日志,當(dāng)出現(xiàn)操作時,通知專門的模塊來修改緩存,做到修改緩存和業(yè)務(wù)邏輯解耦。

同時為了解決緩存刪除失敗的問題,當(dāng)發(fā)生失敗時,發(fā)送消息至消息隊(duì)列傳遞給專門的模塊進(jìn)行重試刪除。

中間件選擇:

  • 緩存使用Redis
  • 監(jiān)聽binlog使用canal
  • 消息隊(duì)列使用RocketMQ

架構(gòu)如下所示:

SQL優(yōu)化

查詢優(yōu)化可以從兩個方面進(jìn)行:

  • 根據(jù)高頻的查詢case,遵循最左匹配原則,設(shè)置對應(yīng)的索引或聯(lián)合索引
  • 通過了解業(yè)務(wù)場景,看看能否將一些小SQL合并成大SQL

通過本文的介紹,我們可以看到,優(yōu)化慢查詢并不一定需要對程序代碼進(jìn)行復(fù)雜的修改。通過巧妙地運(yùn)用緩存和SQL優(yōu)化手段,我們可以達(dá)到相同或者更好的效果。在實(shí)際的開發(fā)中,我們應(yīng)該繼續(xù)探索和研究這些優(yōu)化方法,以提高程序的效率和穩(wěn)定性。

到此這篇關(guān)于通過緩存+SQL修改優(yōu)雅地優(yōu)化慢查詢的文章就介紹到這了,更多相關(guān)優(yōu)化慢查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql隨機(jī)查詢10條數(shù)據(jù)的三種方法

    mysql隨機(jī)查詢10條數(shù)據(jù)的三種方法

    本文主要介紹了mysql隨機(jī)查詢10條數(shù)據(jù)的三種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • MySQL?人臉向量歐幾里得距離相似查詢步驟梳理

    MySQL?人臉向量歐幾里得距離相似查詢步驟梳理

    這篇文章主要為大家介紹了MySQL?人臉向量歐幾里得距離相似查詢步驟梳理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • mysql8.0 JSON_CONTAINS的使用說明

    mysql8.0 JSON_CONTAINS的使用說明

    這篇文章主要介紹了mysql8.0 JSON_CONTAINS的使用說明,具有很好的參考價值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 5個MySQL GUI工具推薦,幫助你進(jìn)行數(shù)據(jù)庫管理

    5個MySQL GUI工具推薦,幫助你進(jìn)行數(shù)據(jù)庫管理

    這篇文章主要介紹了5個MySQL GUI工具推薦,幫助大家更好的進(jìn)行MySQL數(shù)據(jù)庫管理,感興趣的朋友可以了解下
    2020-08-08
  • 如何將Excel文件導(dǎo)入MySQL數(shù)據(jù)庫

    如何將Excel文件導(dǎo)入MySQL數(shù)據(jù)庫

    這篇文章主要為大家詳細(xì)介紹了Excel文件導(dǎo)入MySQL數(shù)據(jù)庫的具體方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • MySQL 關(guān)閉子表的外鍵約束檢察方法

    MySQL 關(guān)閉子表的外鍵約束檢察方法

    下面小編就為大家?guī)硪黄狹ySQL 關(guān)閉子表的外鍵約束檢察方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • mysql增加外鍵約束具體方法

    mysql增加外鍵約束具體方法

    在本篇文章里小編給大家整理的是一篇關(guān)于mysql增加外鍵約束具體方法及相關(guān)實(shí)例內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)下。
    2021-12-12
  • mysql判斷字段是否存在的方法

    mysql判斷字段是否存在的方法

    mysql判斷字段是否存在的方法有很多,如使用desc命令、show columns 命令、describe 命令等等,感興趣的朋友可以參考下
    2014-01-01
  • MYSQL?增加從庫方式介紹

    MYSQL?增加從庫方式介紹

    這篇文章主要介紹了MYSQL?增加從庫方式介紹,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助
    2022-08-08
  • MySQL 存儲過程和"Cursor"的使用方法

    MySQL 存儲過程和"Cursor"的使用方法

    本文中介紹了一個MySQL的存儲過程,其中涉及Cursor的使用
    2008-12-12

最新評論