如何通过自动增加索引,实现数据库查询耗时降低50%?
作者 | 利開園
責編 | Carol
封圖 | CSDN 下載自視覺中國
很多開發者都遇到類似這樣的經歷:一個產品功能開發測試都正常,發布上線后也正常,但是過一段后,如果有個活動或流量一大程序就突然卡了,也有可能流量正常也沒搞活動,但是過一段時間后程序響應越來越慢,這個時候一般都要花很大精力去排查原因,最后發現是數據庫查詢沒有索引導致的。流量大或數據量增加后會導致請求變慢,加上索引就正常了。
在小程序云開發的數據庫場景下,我們會思考為什么會出現這樣的問題?為什么用戶總是會忘記加索引?能不能讓用戶無需關心這個問題,數據庫自動加上索引?
業界方案及其問題
針對這個問題,業界一般采用的是全量索引的方案:通過給所有的字段加單字段索引,引導用戶主動添加多字段索引,從而實現保證所有的查詢都有索引。但這樣代價是會有大量的冗余索引,占用了大量的磁盤空間,而且,一些多字段的場景下,依然需要用戶參與。這樣的方案不能滿足云開發 Cloudbase 的需求。
云開發數據庫自動化索引
在這個問題上,騰訊云和微信聯合推出的小程序云開發,就做出了比較積極的應對措施。在其對業務進行分析后,提出了自己的解決方案 —— 分析數據并自動建立索引。針對系統中查詢較慢的用戶請求,自動分析出最佳建立索引的方式,并基于此建立索引,從而覆蓋了單字段索引和多字段索引的情況。
想要理解自動建立索引,就要了解如何手動建立索引:對于單字段索引,建立起來比較簡單,無論升序還是降序都是一樣的。但對于多字段組合索引時,會有各種方式來建立索引,比如,三個字段的索引,就會受限制于索引是否覆蓋了三個不同的字段、字段相應的升降序是否匹配,如果不匹配,可能索引就沒有效果。
正因為加好索引并不簡單,也證明自動加索引勢在必行。而要做好自動增加索引遇到的主要問題有:
如何盡量減少索引個數避免影響寫入性能和磁盤消耗過多。
如何避免添加索引導致的鎖表影響正常的用戶數據查詢。
如何盡量規避加索引觸發未知問題。
自動增加的索引如何自動刪除。
針對這些問題,小程序云開發的解決方案是:通過篩選出耗時超過一定閾值的查詢語句,從而獲得需要進行優化的數據庫查詢,并依據數據庫索引的前綴匹配規則,按照最少創建索引數量的原則,增加相應的索引,盡量讓索引覆蓋到所有的查詢語句。
為了避免添加索引導致的鎖表影響用戶的數據查詢,小程序云開發在具體添加索引的時候,采用了異步添加索引的方式,這是云開發數據庫的一個關鍵能力。另外,通過限制單個數據庫增加索引的頻率和數量來規避未知風險,通過分析線上數據優化自動索引增加算法。最后會定期篩選那些長時間沒有被查詢命中的索引,對其進行刪除,確保系統不會存在太多的冗余索引影響性能。
上述自動索引的整個過程對于用戶來說,都是不可見且無感知的。不過,在實際的上線過程中,大盤的數據查詢整體耗時減少了 50%,用戶側的體驗也發現程序速度突然變快了。
總結
自動索引的方案幫助云開發 Cloudbase 解決了大多數的數據庫查詢較慢的問題,但程序總有覆蓋不到的部分,對于這一部分,小程序云開發表示:后續會在開發階段提示增加相應的索引,以及提供慢查詢日志導出和自定義告警功能,讓用戶感知到問題, 從而在業務邏輯上進行優化。
作者簡介:利開園,騰訊云云開發團隊成員,騰訊高級開發工程師
推薦閱讀淺談分布式存儲中的網絡通信
138 張圖帶你 MySQL 入門!
如何在 Kubernetes 上配置 Jenkins?
突發!印度封禁抖音、微信、快手等 59 款中國 App
厲害!國內大學生計算機編程第一人,一人挑戰一個隊,百度最年輕 T10,現創業自動駕駛
Balancer因通縮代幣STA遭遇閃電貸攻擊,價值50萬美元資產被黑
淺談分布式存儲中的網絡通信
真香,朕在看了!
總結
以上是生活随笔為你收集整理的如何通过自动增加索引,实现数据库查询耗时降低50%?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 德勤2021技术趋势:繁琐、点状的匠人A
- 下一篇: 浪潮云海OS再度登顶 SPEC Clo