免費學習推薦:mysql影片教學
文章目錄
1 前言
伺服器的壓力來很大一部分壓力來自於資料庫的效能,如果沒有穩定的資料庫及伺服器環境,那麼伺服器很容易出現一些故障甚至是宕機,造成的後果也是不可估量的, 因此資料庫的效能最佳化不可或缺。
1.1 資料庫架構
一般的資料庫架構都是一台主伺服器,下面搭載著幾個或十幾個從伺服器進行主從同步,當主伺服器宕機之後,需要程式設計師手動選出一台資料最新的從伺服器接替主伺服器,然後對新的主伺服器進行同步。然而有時因為從伺服器較多,導致這個過程是相當耗時的,並且在這個過程也是對網卡的容量的一個挑戰。
1.2 監控訊息
QPS & TPS:數值越高越好。
並發量:同一時間處理的請求的數量。
CPU使用率:越低越好。
磁碟IO:讀寫效能越高越好。
注意:一般公司在大促活動前後,最好不要在主庫上進行資料庫備份,或在大型活動前取消這類計劃,因為這會嚴重損耗伺服器的效能。
2 影響資料庫的因素
影響資料庫的因素有很多,例如有:sql查詢速度,伺服器硬件,網卡流量,磁碟IO等等,後面我們會細說,以下介紹一下一些監控訊息中回饋給我們的訊息,以及我們應該如何優化它。
2.1 超高的QPS和TPS
由於效率低的SQL,往往會造成超高的QPS和TPS的風險。在一般的大促期間,網站的訪問量會大大的提高,也會提高資料庫的QPS和TPS。
什麼是QPS:每秒鐘處理的查詢量。例如我們有一個cpu的情況下,10ms可以處理一個sql,那麼1s就可以處理100個sql,QPS<=100,但當我們100ms才處理一個sql,那麼我們1s鐘才能處理10個sql,QPS< =10,這兩種情況是相差很大的,因此盡量優化sql效能。
2.2 大量的並發和超高的CPU使用率
那在這種情況下會導致什麼風險呢?
在大量的並發下,可能會導致資料庫連線數被佔滿,這種情況下,盡量將資料庫參數max_connections
設定的大一點(預設值為100),如果超過了這個值的時候會出現報500錯誤的情況。
在超高的CPU使用率下,會因CPU資源耗盡而出現宕機。
2.3 磁碟IO
資料庫的瓶頸之一就是磁碟IO,那麼它會帶來幾點風險:
2.4 網路卡流量
顯而易見,網路卡流量過大造成網路卡IO被佔滿的風險。
一般的網卡是千兆網卡(1000Mb/8 ≈ 100MB)
如果連接數超過了網卡最大容量的時候,就會出現的服務無法連接的情況,那麼我們應該如何避免無法連接資料庫的情況:
select *
進行查詢2.5 大表
什麼樣的表格可以稱為大表?其實都是相對而言,對於不同儲存引擎會有不同的限制。像nosql的資料存儲,並沒有限製表的行數,理論上只要磁碟的容量允許,都可以進行存儲。但當一張表的行數超過千萬行的時候,就會對資料庫的效能產生很大的影響。那我們可以總結大表的特點:
但就算符合了以上的特點,它也可能對我們資料庫效能不會產生很大的影響,因此這個說法是相對的,例如像一般資料庫的日誌表,即使記錄行數很大,文件大小很大,但我們一般只對它進行增加和查詢,不涉及大量的i修改和刪除操作,因此不會對資料庫效能產生很大的影響。
但當有一天因為業務發生變更,需要對這張10個G的日誌表進行列增加的時候,那麼這個工程量無疑是巨大的。
2.5.1 大表對查詢的影響
大表往往代表慢查詢的產生,慢查詢即是指很難在一定的時間內過濾出所需要的數據。
例如在一個上千萬條資料的日誌表上,有一個叫做訂單來源的字段,它記錄訂單是在哪一個平台上進行生成的。在一開始業務不需要的情況下,是不會對資料庫效能造成影響的,但是後面由於業務需求,需要查看這上千萬條資料的具體來自於哪一個平台的訂單量,這一下就產生了很大的問題。
因為由於這些訂單的來源管道只有幾個,區分度很低,所以在上千萬的資料中查詢某一些資料的話,這會消耗大量的磁碟IO,嚴重降低了磁碟的效率。在使用者每一次查看訂單的時候,都會從資料庫查詢一次訂單的來源,這樣會產生大量的慢查詢。
2.5.2 大表對DDL操作的影響
大表對DDL操作的影響,這會為我們帶來什麼風險?
2.5.3 如何處理資料庫中的大表
##2.6 大事務
交易是一組具有原子性的SQL語句,或是一個獨立的工作單元。 因此交易需要符合以下4個特性:原子性,一致性,隔離性,持久性。
#########2.6.2 事務的原子性(ATOMICITY)######定義:一個事務必須被視為一個不可分割的最小工作單元,整個事務中的所有操作要么全部提交成功,要么全部失敗,對於一個事務來說,不可能只執行其中的一部分操作。
範例:
A要轉給B1000元,在A帳戶中取出1000元時,資料庫上A的餘額減去1000,但是在加到B餘額上的時候,伺服器出現了故障,那A的1000元需要回退到A的帳戶中,保持事務原子性,要么一起成功,要么一起失敗。
2.6.3 交易的一致性(CONSISTENCY)
#定義:一致性是指交易將資料庫從一個一致性狀態轉換到另一個一致性狀態,在事務開始之前和事務結束後資料庫中資料的完整性沒有被破壞。
例:
銀行中A的1000塊轉給了B,A的餘額為0,B的帳戶餘額從0變為1000,但是從頭到尾,A B = 1000(A的餘額) 0( B的餘額) = 0(A的餘額) 1000(B的餘額),也就是說,A和B的總餘額數是不變的,從頭到尾還是1000元。
2.6.4 交易的隔離性(ISOLATION)
#定義:隔離性要求一個交易對資料庫中資料的修改,在未提交完成其他交易時不可見的。
範例:
銀行中A從餘額1000元中取款500元,在取款事務還沒提交前,執行了一個查詢A帳戶餘額的事務,那查詢出來的結果還是餘額1000元,因為在在取款事務還沒提交之前,其他業務對它的事務過程是不可見的。
SQL標準中定義的四個隔離等級
# 未提交讀取(READ UNCOMMITED)
已提交讀取(READ COMMITED)
可重複讀取(REPEATABLE READ)
show variables like '% iso%'
set session tx_isolation='read-committed'
可串行化(SERIALIZABLE)
隔離性:
並發性:
2.6.5 交易的持久性(DURABILITY)
定義:一旦交易提交,則其所做的修改就會永久儲存到資料庫中。此時即使系統崩潰,已經提交的修改資料也不會遺失(不包括磁碟損壞等物理因素)。
範例:
銀行中A用戶存入帳戶1000元,事務提交後,即使銀行系統崩潰,但在恢復回來後,除非A對餘額進行了操作,否則A帳戶中的1000元是不會變的,這就是事務的持久性。
2.6.7 什麼是大事務
講了這麼多,那什麼是大事務?
大事務就是指運行時間比較長,操作的資料比較多的事務。舉例來說,有一個理財產品每天都會統計每個用戶前一天的收入所得,那如果需要統計所有用戶的收入所得並更新到用戶餘額中,這時數以億計的更新就需要數小時,如果中途出現的故障進行的回滾,事務需要進行的時間就更加不可估量,還不包括在更新過程中,會對用戶的餘額進行加鎖,造成所有用戶都無法使用餘額這樣的問題。
能做到以上的兩點基本上可以避免大事務的產生。
#更多相關免費學習推薦:mysql教學#(影片)
以上是掌握MYSQL進階的詳細內容。更多資訊請關注PHP中文網其他相關文章!