如何通過自動增加索引,實現數據庫查詢耗時降低50%?

作者 | 利開園

責編 | Carol

封圖 | CSDN 下載自視覺中國

很多開發者都遇到類似這樣的經歷:一個產品功能開發測試都正常,發佈上線後也正常,但是過一段後,如果有個活動或流量一大程序就突然卡了,也有可能流量正常也沒搞活動,但是過一段時間後程序響應越來越慢,這個時候一般都要花很大精力去排查原因,最後發現是數據庫查詢沒有索引導致的。流量大或數據量增加後會導致請求變慢,加上索引就正常了。

在小程序雲開發的數據庫場景下,我們會思考爲什麼會出現這樣的問題?爲什麼用戶總是會忘記加索引?能不能讓用戶無需關心這個問題,數據庫自動加上索引?

業界方案及其問題

針對這個問題,業界一般採用的是全量索引的方案:通過給所有的字段加單字段索引,引導用戶主動添加多字段索引,從而實現保證所有的查詢都有索引。但這樣代價是會有大量的冗餘索引,佔用了大量的磁盤空間,而且,一些多字段的場景下,依然需要用戶參與。這樣的方案不能滿足雲開發 Cloudbase 的需求。

雲開發數據庫自動化索引

在這個問題上,騰訊雲和微信聯合推出的小程序雲開發,就做出了比較積極的應對措施。在其對業務進行分析後,提出了自己的解決方案 —— 分析數據並自動建立索引。針對系統中查詢較慢的用戶請求,自動分析出最佳建立索引的方式,並基於此建立索引,從而覆蓋了單字段索引和多字段索引的情況。

想要理解自動建立索引,就要了解如何手動建立索引:對於單字段索引,建立起來比較簡單,無論升序還是降序都是一樣的。但對於多字段組合索引時,會有各種方式來建立索引,比如,三個字段的索引,就會受限制於索引是否覆蓋了三個不同的字段、字段相應的升降序是否匹配,如果不匹配,可能索引就沒有效果。

正因爲加好索引並不簡單,也證明自動加索引勢在必行。而要做好自動增加索引遇到的主要問題有:

  1. 如何儘量減少索引個數避免影響寫入性能和磁盤消耗過多。

  2. 如何避免添加索引導致的鎖表影響正常的用戶數據查詢。

  3. 如何儘量規避加索引觸發未知問題。

  4. 自動增加的索引如何自動刪除。

針對這些問題,小程序雲開發的解決方案是:通過篩選出耗時超過一定閾值的查詢語句,從而獲得需要進行優化的數據庫查詢,並依據數據庫索引的前綴匹配規則,按照最少創建索引數量的原則,增加相應的索引,儘量讓索引覆蓋到所有的查詢語句。

爲了避免添加索引導致的鎖表影響用戶的數據查詢,小程序雲開發在具體添加索引的時候,採用了異步添加索引的方式,這是雲開發數據庫的一個關鍵能力。另外,通過限制單個數據庫增加索引的頻率和數量來規避未知風險,通過分析線上數據優化自動索引增加算法。最後會定期篩選那些長時間沒有被查詢命中的索引,對其進行刪除,確保系統不會存在太多的冗餘索引影響性能。

上述自動索引的整個過程對於用戶來說,都是不可見且無感知的。不過,在實際的上線過程中,大盤的數據查詢整體耗時減少了 50%,用戶側的體驗也發現程序速度突然變快了。

總結

自動索引的方案幫助雲開發 Cloudbase 解決了大多數的數據庫查詢較慢的問題,但程序總有覆蓋不到的部分,對於這一部分,小程序雲開發表示:後續會在開發階段提示增加相應的索引,以及提供慢查詢日誌導出和自定義告警功能,讓用戶感知到問題, 從而在業務邏輯上進行優化。

作者簡介:利開園,騰訊云云開發團隊成員,騰訊高級開發工程師

推薦閱讀

真香,朕在看了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章