免費學習推薦:mysql影片教學
文章目錄
- 1 前言
- 1.1 資料庫架構
- 1.2 監控資訊
- 2 影響資料庫的因素
- 2.1 超高的QPS和TPS
- 2.2 大量的並發和超高的CPU使用率
- 2.3 磁碟IO
- 2.4 網路卡流量
- 2.5 大表
- 2.5.1 大表對查詢的影響
- 2.5.2 大表對DDL操作的影響
- 2.5.3 如何處理資料庫中的大表
- #2.6 大事務
- 2.6.1 什麼是交易
- 2.6.2 交易的原子性(ATOMICITY)
- 2.6.3 交易的一致性(CONSISTENCY)
- 2.6.4 交易的隔離性(ISOLATION)
- 2.6.5 交易的持久性(DURABILITY)
- 2.6.7 什麼是大交易
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
2.2 大量的並發和超高的CPU使用率
那在這種情況下會導致什麼風險呢?
在大量的並發下,可能會導致資料庫連線數被佔滿,這種情況下,盡量將資料庫參數max_connections
設定的大一點(預設值為100),如果超過了這個值的時候會出現報500錯誤的情況。
在超高的CPU使用率下,會因CPU資源耗盡而出現宕機。
2.3 磁碟IO
資料庫的瓶頸之一就是磁碟IO,那麼它會帶來幾點風險:
- 磁碟IO效能突然下降
這往往會發生在熱資料大於伺服器可用記憶體的情況下。通常這種情況我們只能使用更快的磁碟設備來解決。 - 其他大量消耗磁碟效能的排程任務
這一點我們上面也提到了,最好避免在大促之前在主資料庫上進行備份,或在從伺服器上進行,調整排程任務,做好磁碟維護。
2.4 網路卡流量
顯而易見,網路卡流量過大造成網路卡IO被佔滿的風險。
一般的網卡是千兆網卡(1000Mb/8 ≈ 100MB)
如果連接數超過了網卡最大容量的時候,就會出現的服務無法連接的情況,那麼我們應該如何避免無法連接資料庫的情況:
- 減少從伺服器的數量
因為每個從伺服器都要從主伺服器上面複製日誌,因此從伺服器越多,網路卡流量就越大。 - 進行分級快取
一定要避免前端快取突然失效而導致的後端存取量突然變大的情況。 - 避免使用
select *
進行查詢
這是一種最基本的資料庫最佳化的方法,查詢出沒有必要的欄位也會消耗大量的網路流量。 - 分離業務網路和伺服器網路
這樣可以避免主從同步或網路備份影響網路的效能。
2.5 大表
什麼樣的表格可以稱為大表?其實都是相對而言,對於不同儲存引擎會有不同的限制。像nosql的資料存儲,並沒有限製表的行數,理論上只要磁碟的容量允許,都可以進行存儲。但當一張表的行數超過千萬行的時候,就會對資料庫的效能產生很大的影響。那我們可以總結大表的特點:
- 記錄行數龐大,單表超過千萬行
- 表格資料檔龐大,表格資料檔超過10G
但就算符合了以上的特點,它也可能對我們資料庫效能不會產生很大的影響,因此這個說法是相對的,例如像一般資料庫的日誌表,即使記錄行數很大,文件大小很大,但我們一般只對它進行增加和查詢,不涉及大量的i修改和刪除操作,因此不會對資料庫效能產生很大的影響。
但當有一天因為業務發生變更,需要對這張10個G的日誌表進行列增加的時候,那麼這個工程量無疑是巨大的。
2.5.1 大表對查詢的影響
大表往往代表慢查詢的產生,慢查詢即是指很難在一定的時間內過濾出所需要的數據。
例如在一個上千萬條資料的日誌表上,有一個叫做訂單來源的字段,它記錄訂單是在哪一個平台上進行生成的。在一開始業務不需要的情況下,是不會對資料庫效能造成影響的,但是後面由於業務需求,需要查看這上千萬條資料的具體來自於哪一個平台的訂單量,這一下就產生了很大的問題。
因為由於這些訂單的來源管道只有幾個,區分度很低,所以在上千萬的資料中查詢某一些資料的話,這會消耗大量的磁碟IO,嚴重降低了磁碟的效率。在使用者每一次查看訂單的時候,都會從資料庫查詢一次訂單的來源,這樣會產生大量的慢查詢。
2.5.2 大表對DDL操作的影響
大表對DDL操作的影響,這會為我們帶來什麼風險?
- 在建立索引上需要很長的時間
在MySQL的5.5版本之前,資料庫在建立索引的時候會進行鎖定表,而在5.5版本之後,雖然不會鎖定表,但由於MySQL的複製機制是在新的主機上執行,然後才能透過日誌方式傳送給從機,這樣會引起長時間的主從延遲,影響正常的業務。 - 修改表結構需要長時間鎖定表
在修改表的結構過程中進行鎖定表,會給我們造成長時間主從延遲的風險。由於我們MySQL的主從複製機制,往往是所有的表結構操作是在主機上先執行完成再透過日誌方式傳給從機進行相同的操作,然後才完成表結構的主從複製。
假設我們修改一個表格的結構,在主伺服器上修改的時間為480s,那麼我們在從資料庫上的修改時間也為480s。由於現在MySQL的主從複製都是使用單線程,所以一旦有大表修改,在從伺服器上沒有完成相關操作之前,其他的資料修改操作都無法執行,因此這會造成至少480s以上的主從延遲。
同時會影響資料的正常操作,這會造成所有的插入操作被阻塞,連線數會大額提高並佔滿伺服器,這時就會導致伺服器出現500的連線錯誤。
2.5.3 如何處理資料庫中的大表
- 分庫分錶,把一張大表分成多個小表
困難:- 分錶主鍵的選擇
- 分錶後跨分區資料的查詢和統計
- 大表的歷史資料歸檔
作用:減少對前後端業務的影響
困難:
##2.6 大事務
- 2.6.1 什麼是交易
交易是一組具有原子性的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 什麼是大事務
講了這麼多,那什麼是大事務?
大事務就是指運行時間比較長,操作的資料比較多的事務。舉例來說,有一個理財產品每天都會統計每個用戶前一天的收入所得,那如果需要統計所有用戶的收入所得並更新到用戶餘額中,這時數以億計的更新就需要數小時,如果中途出現的故障進行的回滾,事務需要進行的時間就更加不可估量,還不包括在更新過程中,會對用戶的餘額進行加鎖,造成所有用戶都無法使用餘額這樣的問題。
- 大交易會造成哪些風險:
- #鎖定太多的數據,造成大量的阻塞和鎖定逾時
- 回滾時所需的時間比較長
- 執行時間長,容易造成主從延遲
- #如何避免大交易?
- 避免一次處理太多的資料。
- 移出不必要的交易中的SELECT操作。
能做到以上的兩點基本上可以避免大事務的產生。
#更多相關免費學習推薦:mysql教學#(影片)
以上是掌握MYSQL進階的詳細內容。更多資訊請關注PHP中文網其他相關文章!

MySQL和SQLite的主要區別在於設計理念和使用場景:1.MySQL適用於大型應用和企業級解決方案,支持高性能和高並發;2.SQLite適合移動應用和桌面軟件,輕量級且易於嵌入。

MySQL中的索引是數據庫表中一列或多列的有序結構,用於加速數據檢索。 1)索引通過減少掃描數據量提升查詢速度。 2)B-Tree索引利用平衡樹結構,適合範圍查詢和排序。 3)創建索引使用CREATEINDEX語句,如CREATEINDEXidx_customer_idONorders(customer_id)。 4)複合索引可優化多列查詢,如CREATEINDEXidx_customer_orderONorders(customer_id,order_date)。 5)使用EXPLAIN分析查詢計劃,避

在MySQL中使用事務可以確保數據一致性。 1)通過STARTTRANSACTION開始事務,執行SQL操作後用COMMIT提交或ROLLBACK回滾。 2)使用SAVEPOINT可以設置保存點,允許部分回滾。 3)性能優化建議包括縮短事務時間、避免大規模查詢和合理使用隔離級別。

選擇PostgreSQL而非MySQL的場景包括:1)需要復雜查詢和高級SQL功能,2)要求嚴格的數據完整性和ACID遵從性,3)需要高級空間功能,4)處理大數據集時需要高性能。 PostgreSQL在這些方面表現出色,適合需要復雜數據處理和高數據完整性的項目。

MySQL數據庫的安全可以通過以下措施實現:1.用戶權限管理:通過CREATEUSER和GRANT命令嚴格控制訪問權限。 2.加密傳輸:配置SSL/TLS確保數據傳輸安全。 3.數據庫備份和恢復:使用mysqldump或mysqlpump定期備份數據。 4.高級安全策略:使用防火牆限制訪問,並啟用審計日誌記錄操作。 5.性能優化與最佳實踐:通過索引和查詢優化以及定期維護兼顧安全和性能。

如何有效監控MySQL性能?使用mysqladmin、SHOWGLOBALSTATUS、PerconaMonitoringandManagement(PMM)和MySQLEnterpriseMonitor等工具。 1.使用mysqladmin查看連接數。 2.用SHOWGLOBALSTATUS查看查詢數。 3.PMM提供詳細性能數據和圖形化界面。 4.MySQLEnterpriseMonitor提供豐富的監控功能和報警機制。

MySQL和SQLServer的区别在于:1)MySQL是开源的,适用于Web和嵌入式系统,2)SQLServer是微软的商业产品,适用于企业级应用。两者在存储引擎、性能优化和应用场景上有显著差异,选择时需考虑项目规模和未来扩展性。

在需要高可用性、高級安全性和良好集成性的企業級應用場景下,應選擇SQLServer而不是MySQL。 1)SQLServer提供企業級功能,如高可用性和高級安全性。 2)它與微軟生態系統如VisualStudio和PowerBI緊密集成。 3)SQLServer在性能優化方面表現出色,支持內存優化表和列存儲索引。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

記事本++7.3.1
好用且免費的程式碼編輯器