什麼是資料庫的瓶頸?
io瓶頸和cpu瓶頸都會導致資料庫的活躍連線數增加,臨近資料庫可承載活躍連線數的閥值,即可用的資料庫連線少甚至無連線可用(崩潰)。
如何應對io瓶頸?
①磁碟讀io瓶頸,資料太多,資料庫快取放不下,每次查詢會產生大量的io導致查詢速度低 -> 可考慮分庫和垂直分表。
②網路io瓶頸,請求資料過多,網路頻寬不夠 -> 可考慮分庫。
如何應對cpu瓶頸?
①sql查詢語句不當,非索引查詢過多,導致cpu運算增加 -> 優化sql。
②單標資料量過大,查詢掃瞄行過多,sql效率低 -> 水平分表
什麼是水平分庫?
水平分庫是以字段為依據,根據一定的策略,將乙個表中的資料拆分到多個庫中。
水平分庫結果:
使用場景:系統絕對併發量上來,分表難以根本上解決問題。分庫後庫多了,io和cpu的壓力得到成倍的緩解。
什麼是水平分表?
水平分表,以字段為依據,按照一定的策略,將乙個表中的資料拆分到多個表中。
水平分表結果:
使用場景:系統絕對併發量沒有上來,只是單標資料量太多,影響了sql效率,加重了cpu負擔(cpu瓶頸)。分表後,表的資料量少了,單次sql執行效率高,減輕了cpu的負擔。
什麼是垂直分庫?
垂直分庫,是以表為依據,按照業務歸屬不同,將不同的表拆分到不同的庫中。
分庫結果:
使用場景:系統絕對併發量上來了,並且可以抽象出單獨的業務模組。分庫後庫多了,io和cpu的壓力得到成倍的緩解。到這一步後基本可以服務化了。
什麼是垂直分表?
垂直分表,以字段為依據,按照欄位的活躍性,將表中的字段拆到不同的表中(主表和拓展表)。
分表結果:
使用場景:系統的絕對併發量沒有上來,表的記錄不多,但是欄位多,並且熱點資料和非熱點資料在一起,單行資料所需的儲存空間大,查詢時會去讀磁碟資料產生大量的讀io,產生io瓶頸。
以上參考來自
Mysql分庫分表方案
1.為什麼要分表 當一張表的資料達到幾千萬時,你查詢一次所花的時間會變多,如果有聯合查詢的話,我想有可能會死在那兒了。分表的目的就在於此,減小資料庫的負擔,縮短查詢時間。mysql中有一種機制是表鎖定和行鎖定,是為了保證資料的完整性。表鎖定表示你們都不能對這張表進行操作,必須等我對錶操作完才行。行鎖...
mysql分庫分表方案
分庫分表的幾種方式 1 把乙個例項中的多個資料庫拆分到不同的例項 2 把乙個庫中的表分離到不同的資料庫中 3 對乙個庫中的相關表進行水平拆分到不同的例項資料庫中 如何選擇分割槽鍵 1 分割槽鍵要能盡量避免跨分片查詢的發生 2 分割槽鍵要能盡量使各個分片中的資料平均 如何儲存無需分片的表 1 每個分片...
分庫分表方案(一)
零 概述 當活躍連線數量接近或者達到資料庫可以承載的連線數量閾值時將會出現io瓶頸和cpu效能瓶頸,進而導致上層業務系統的併發量 吞吐量出現問題,甚至導致系統崩潰。下面我先來說一下造成io瓶頸和cpu效能瓶頸的原因。cpu瓶頸 當sql語句中含有 join group by order by 以及非...