{eval=Array;=+count(Array);}

国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

問答專欄Q & A COLUMN

Mysql某個表有近千萬數據,CRUD比較慢,該如何優化呢?

SnaiLiuSnaiLiu 回答0 收藏1
收藏問題

2條回答

luzhuqun

luzhuqun

回答于2022-06-28 14:54

我是【會點代碼的大叔】,每天為你分享程序員干貨,關注并私信我數字“1”,送你一份程序員大禮包。

MySQL 數據庫某張表近千萬的數據,CRUD比較慢,如何優化?

說實話,這個數據量級, MySQL 單庫單表支撐起來完全沒有問題的,所以首先還是考慮數據庫本身的優化。



從上圖可以看到,數據庫優化通常可以通過以上幾點來實現:

  • 硬件升級:也就是花更多的錢,升級我們數據庫硬件配置,包括 CPU、內存、磁盤、網絡等等,但是這個方案成本高,而且不一定能起到非常好的效果。
  • 數據庫配置:修改數據庫的配置,有可能讓我們的 CRUD 操作變得更快,不過我也不建議大家把經歷放在這一點上面;首先,數據庫的配置通常由專業的 DBA 來負責;第二,大部分時候,默認的數據庫配置在大多數情況下已經是最優配置了。


對于開發人員來說,我們需要把注意力放在后面三點:


數據結構的優化,也就是表結構的優化

  • 數據類型的選擇:選用合適的數據結構。什么叫做"合適的數據結構",比如性別字段,M表示男F表示女,那么一個 char(1) 就足夠了,如果存儲人的年齡,那么就沒有必要使用 INT 這么大范圍的字段了;
  • 適當的拆分:千萬不要試圖把所有的字段放在一張表中,因為這會非常影響性能,通常一張表的字段最好不要超過 30 個;
  • 適當的冗余:如果一些常用的字段,可能會用在不同的維度,那么我們可以把這些字段設計在多張表中,因為這樣可能會減少表關聯;
  • 字段盡量設置成 not Null,盡量帶有默認值。


SQL 語句的優化

優化 SQL 語句執行速度的方法有很多,比如:

  • 盡量使用索引,盡量避免全表掃描,提高查詢速度;
  • 當然你不能無限制地建立索引;維護索引也會影響性能,會降低 DML 操作的速度;
  • 注意 SQL 語句的書寫,有一些錯誤的寫法可能會導致索引失效;
  • 盡量避免在 where 子句中對字段進行 Null 值判斷(當然我們在表設計中,直接建議不要有 Null);
  • 條件值多的情況下,盡量不要使用 in 和 not in ;
  • select 的時候,使用具體的字段代替 * 號
  • 避免返回大量數據,增加分頁;


減少數據庫的訪問

  • 我們可以通過增加本地緩存或分布式緩存的方式,將熱點數據存儲到緩存中,以減少數據庫的訪問;
  • 終極大招,如果是一個不合理的需求,我們可以拒絕做這個需求,這樣也算是"減少了數據庫訪問"。


說完了 MySQL 本身的優化,如果數據量進一步增大的話,我們還有什么優化的方案呢?


讀寫分離

主庫用于寫,從庫用于讀,將讀寫分散在不同的數據庫上,利用多臺機器的資源,來提高數據庫的可用性和性能。



分庫分表

如果數據持續增多,超過了單臺 MySQL 的支撐上限,那么只能用【分庫分表】這一招了;我們可以采用一定的路由規則,將數據保存到不同的數據庫中。

當然,如果不是“迫不得已”,我是不太建議分庫分表的,因為這樣極大地增加了系統的復雜程度,并且會帶來更多的問題需要開發人員解決。



以上就是常用的 MySQL 優化方案,如果是千萬級數據量,優化 MySQL 本身即可。


會點代碼的大叔 | 原創

一個寫代碼的架構師,專注程序員的學習和成長,關注并私信我數字“1”,送你一份程序員大禮包。

評論0 贊同0
  •  加載中...
sydMobile

sydMobile

回答于2022-06-28 14:54

MySQL 數據庫某張表近千萬的數據,CRUD比較慢,如何優化?最常見的是線程池優化、索引優化、緩存優化、讀寫分離、數據庫拆分等,上述4種優化可以從不同角度來優化我們的數據庫操作,其中的可操作性性要看團隊的技術能力和應用的維護能力,我就以自己遇到過的應用場景簡單談談自己的優化流程。

換到新的團隊,遇到的第一個棘手問題就是數據庫不定時的出現“Cannot get a connection, pool error Timeout waiting for idle object”,經和DBA溝通,其反饋數據庫group(數據庫量級4kw+)中的查詢邏輯很多,qps達1w+,并且慢sql積壓,拖垮了數據庫。從慢sql和上述查詢異常著手,進行千萬級的數據庫優化。

1. 線程池優化。線上的讀線程池16,寫線程池池16,考慮到數據查詢時獲取不到數據庫連接,將讀線程池調整為32,其優化效果不明顯,數據庫建立連接的異常仍然存在。


2.索引優化。經和DBA分析相關的慢sql語句,發現其索引都是完備的,也就是說每個查詢都可以落到對應的索引邏輯,這點兒我們心里是有數的,畢竟線上正常運行了2年多數據庫,當時建庫和查詢時肯定考慮到了索引的情況。也就是說,在這方面沒有優化的余地。

3.緩存優化。經排查,線上的相關操作采用緩存加速,緩存時間1h或24h不等,考慮到數據庫瓶頸和更新數據刪緩存的邏輯,將緩存時間延長至7天。該優化邏輯上線后,數據庫異常有所減弱,但問題仍未解決。偶爾發現,客戶端偶爾會請求服務端不存在的數據,引發緩存穿透。而針對該庫涉及到的可能存在緩存穿透的邏輯,進行了一系列優化。優化之后,效果特別明顯,也就是在線上業務達到一定量級時,要特別注意緩存穿透,這點在業務剛開始時很容易被忽略。

4.讀寫分離。雖然通過緩存穿透的優化處理,解決了數據庫連接異常的問題,但是讀寫分離仍然值得嘗試,讀寫分離是應對讀多寫少業務的一大利器,一主多從的讀寫分離模式被引入彈性數據庫體系,讓我們在特殊節點的業務保障更有信心。

5.數據庫拆分,也就是分庫分表。業務發展到一定程度,分庫分表是優化的必經之路,也是我們團隊一項很重要的優化業務,但限于業務場景、分庫分表規則、多維度查詢、團隊研發資源等,目前正在規劃中。

綜上所述,通過優化緩存穿透和讀寫分離解決了我們線上業務的數據庫性能問題,可操作性強,風險相對降低。

作者:夕陽雨晴,歡迎關注我的頭條號:偶爾美文,主流Java,為你講述不一樣的碼農生活。

評論0 贊同0
  •  加載中...

最新活動

您已邀請0人回答 查看邀請

我的邀請列表

  • 擅長該話題
  • 回答過該話題
  • 我關注的人
向幫助了您的網友說句感謝的話吧!
付費偷看金額在0.1-10元之間
<