TiDB 社區智慧合集丨解碼 TiDB 性能謎題:讓你的數據庫發揮最強動力!

來自社區,迴歸社區。非常感謝各位 TiDBer 在之前 【TiDBer 嘮嗑茶話會丨徵集 TiDB 數據庫性能優化大師,你是如何優化 TiDB 數據庫性能的吶?】( https://asktug.com/t/topic/1005563 )裏提供的各種性能優化方法。這篇帖子收集整理了大家推薦的各個方面的 TiDB 數據庫性能優化方法,歡迎各位 TiDBer 持續補充更新~

1 硬件和網絡優化

方法 1

貢獻者:@kongdom

開啓 Raid 卡緩存,使機械硬盤的 I/O 性能直線提升。

MegaCli64 -LDInfo -Lall -aALL #查看

MegaCli64 -LDSetProp -WB -Lall -aAll #有電池啓用緩存

MegaCli64 -LDSetProp CachedBadBBU -Lall -aALL #沒有電池啓用緩存

MegaCli64 -LDSetProp NOCachedBadBBU -Lall -aALL #沒有電池關閉緩存

注意:必須保證 Raid 卡的電池正常,否則意外斷電會導致數據丟失

方法 2

貢獻者:@tomxu

  1. 優化磁盤性能:使用高性能 SSD 硬盤以減少磁盤 I/O 延遲。
  2. 優化網絡性能:使用高速網絡設備和優化網絡拓撲結構以降低網絡延遲。
  3. 優化 CPU 和內存:確保 TiDB 集羣有足夠的 CPU 和內存資源,以便在高負載下保持良好的性能。

方法 3

貢獻者:@ShawnYan

dstat 查看當前硬件資源狀態

方法 4

貢獻者:@TiDBer_ 小小

硬件優化:對硬件進行優化,升級硬件、調整硬件參數、調整系統參數、優化系統配置。

2 SQL 方面優化

方法 1

貢獻者:@tidb 菜鳥一隻

一、

  1. 先看執行計劃,最簡單的,看看是不是缺索引,是的話,直接加索引;
  2. 如果因爲統計信息太舊導致執行計劃異常,直接重新收集統計信息;
  3. 統計信息很新但是執行計劃仍然不對,指定 hint;
  4. SQL 執行計劃都對,但是速度還是不理想, 如果是 OLTP 請求,改寫 SQL 或者聯繫開發修改應用邏輯;
  5. SQL 執行計劃對,但是速度不理想,如果是 OLAP 請求,直接上 TiFlash

二、

如果以上都做了,性能還達不到要求,那麼【參數層面優化】

  1. 看看是不是某些參數設置有問題,能在線修改參數的直接在線修改;
  2. 不能在線修改的,修改配置文件參數後 reload 集羣

三、

再看主機資源

  1. 是不是有主機其他進程擠佔主機資源;
  2. 看看主機的參數是否可以優化

四、

以上方法都用過了,發現性能還是達不到:

評估當前集羣的資源利用率,不足直接向老闆申請擴容

方法 2

貢獻者:@褲衩兒飛上天

  1. 規範開發
  2. 把慢 SQL 優化掉,基本能解決 80%的數據庫問題
  3. 升級硬件

3 查詢優化

方法 1

貢獻者:@coderv

可以通過分片、路由等技術來避免大量的熱點數據,從而提高系統的可擴展性和可用性。在編寫 SQL 語句時,應該儘量減少全表掃描,使用合適的索引來提高查詢性能。比如可以使用覆蓋索引、前綴索引、聯合索引等技術來減少索引佔用空間、提高查詢效率。

方法 2

貢獻者:@tomxu

  1. 使用索引 :爲經常用於查詢條件和排序的列創建索引。這將有助於提高查詢效率。
  2. 避免全表掃描 : 通過使用索引避免全表掃描。
  3. 優化複雜查詢 :將複雜查詢分解爲多個簡單查詢,以提高查詢效率。
  4. 使用 EXPLAIN 分析查詢計劃 : 通過 EXPLAIN 命令 分析查詢計劃,找出慢查詢的原因並進行優化
  5. 避免使用子查詢 :儘量將子查詢轉換爲 JOIN 查詢,以提高查詢效率 。

方法 3

貢獻者:@凌雲 Cloud

  1. 使用合適的索引:根據查詢語句的特點和數據分佈情況,選擇合適的單列或多列索引。對於複雜的查詢,可以考慮使用覆蓋索引或索引合併等技術來提高性能。 2. 避免全表掃描:儘可能地使用索引來避免全表掃描。如果無法使用索引,可以考慮將數據劃分爲更小的分區或者分頁查詢。 3. 使用連接查詢時,避免過度連接:連接查詢會增加查詢的複雜度和執行時間。可以考慮使用子查詢、關聯子查詢、EXISTS 或者 NOT EXISTS 等方式來代替連接查詢。

方法 4

貢獻者:@TiDBer_ 小小

對數據庫查詢語句進行優化,包括選擇合適的索引、使用合適的查詢語句、調整查詢參數。

方法 5

貢獻者:@Soysauce520

  1. 根據 cluster_slow_query 找到開銷較大的 SQL 分析優化可能性。 2. 沒有優化空間,就需要擴容。

方法 6

貢獻者:@SoloX

通過分析業務需求和 SQL 執行計劃,使用合適的索引、避免全表掃描、調整 SQL 語句等方式來提高查詢性能。

4 統計信息優化

方法 1

貢獻者:@tomxu

  1. 更新統計信息:定期更新統計信息以幫助優化器生成更好的查詢計劃。 2. 調整統計信息收集參數:根據實際情況調整統計信息收集參數以提高優化器的準確性。

方法 2

貢獻者:@SoloX

定期收集統計信息並更新,使用多列統計信息以優化複雜查詢的執行計劃。

5 數據庫應用優化

方法 1

貢獻者:@Jellybean

如何通過應用程序的調整和優化來提高數據庫性能?包括緩存、分表、批量操作等優化方法

1.程序裏面 select 語句必須指定要選擇的列,不允許 select * 用法,做好上線和測試工作 2.對於批量 insert 場景,必須開啓批量提交,客戶端和服務端參數都好調整 3.對於批量 update 和 delete 場景,提前和業務溝通,儘量減少此類批量操作,轉而通過 replace 扥方式或業務優化調整 4.對於有大量數據存儲和有時限的表,我們也不建議分表,而且使用分區表,對過期的數據直接通過高效的刪分區方式完成,而不是低效的批量 delete 方式 5.對於高頻訪問的只有幾千行的小型表,設置爲緩存表,可以將每秒過萬的 select 延遲從 5ms 下降到 1ms 左右 6.對於有大量中間計算結果需要複用的應用,我們使用內存臨時表實現

方法 2

貢獻者:@tomxu

  1. 分頁查詢優化: 使用 LIMIT 和 OFFSET 進行分頁查詢時,儘量避免使用較大的 OFFSET ,以降低查詢延遲。 2. 合理使用事務:減少長事務,避免大量行鎖爭用。 3. 減少連接數:通過連接池複用數據庫連接,避免過多的數據庫連接導致資源競爭。 4. 批量操作:針對大量的 INSERT、UPDATE、DELETE 操作,可以使用批量操作來提高性能。

方法 3

貢獻者:@SoloX

利用緩存技術減少對數據庫的訪問,採用分表策略解決單表過大的問題,使用批量操作減少數據庫交互次數。

6 TiDB 集羣優化

貢獻者:@tomxu

  1. 擴展集羣:按需添加更多的 TiDB、TiKV 和 PD 節點,實現集羣的水平擴展。 2. 調整 TiKV 參數:根據實際負載情況調整 TiKV 的參數, 如 raftstore.store-pool-size 、 rocksdb.max-background-jobs 等。 3. 調整 PD 參數:根據實際負載情況調整 PD 的參數, 如 scheduler.limit 等。

7 更多優化方法

方法 1

貢獻者:@TiCQ

【硬優化】硬件優化一般不可主導,每個業務都盡最大建議給“能力之內”的配置!

【軟優化】讀寫優化 90%在 SQL 層面,使用常規 SQL 優化方法進行相關優化處理;再配合數據庫系統優化參數進行設置調優。

方法 2

貢獻者:@老田牛

關鍵在於確定性能問題的具體位置。例如,對於慢 SQL 的問題,需要確定是單次執行慢還是大量類似的語句導致整體操作系統變慢。如果確定是單個 SQL 慢,就需要檢查執行計劃是否合理,是 I/O 還是 CPU 造成的慢,是缺少索引還是統計信息的問題。對於 I/O 問題,需要了解如何收集系統的 I/O 數據,確定是單個磁盤 I/O 慢還是整個系統 I/O 慢,是否有硬件報警。

方法 3

貢獻者:@張雨齊 0720

不同問題有不同的優化手段。比如, 慢 SQL 那就優化 SQL,系統參數設置不當就調整參數,其實應該要具體問題具體分析。不過大部分第一件時間是撈資源使用情況和慢 SQL。

方法 4

貢獻者:@db_user

初始配置先從 analyze 收集的時間段、慢 SQL、不合適的表結構方面優化,如果在這些方面都已經做到最佳狀態,但性能仍然不理想,那麼就需要考慮硬件瓶頸的可能性。

方法 5

貢獻者:@xfworld

把 TiDB 提供的 Dashboard 用好,就能解決很多 T op 級別的問題;

然後在通過 Ggrafana 檢測和排查一些重要的指標,可以從更深度的計算、網絡、資源調度方面做優化。

方法 6

貢獻者:@半瓶醋仙

  1. 評估業務性質,查詢優化:添加索引,數據分片降低查詢複雜度,統計信息優化:配置實時更新。 2. 硬件和網絡優化:在線運維 Dashboard 和 Grafana 打開看磁盤 I/O,CPU,內存網絡流量。TiDB 集羣優化:刷參數配置腳本。 3. 數據庫應用優化:每日 DBA 巡檢日誌對比,加載 API 插件。

方法 7

貢獻者:@bert

原則上, 性能優化也是按需按目標執行,執行 pdca 的過程。分爲硬件和軟件優化,有如下建議:

  1. 評估當前系統性能。TiUP 已經集成了 ch (CH-benCHmark)/ TPCC (TPC-C)/ TPCH (TPC-H)/ YCSB (Yahoo! Cloud Serving Benchmark) 四種測試工具集,使用其進行測試得到系統的基礎數據。
  2. 選擇適合的 TiDB 架構,考慮 TiDB 和 TiFlash 的組合,節點數的配置。硬件的選擇等。
  3. 優化應用的數據類型和索引。
  4. 能批量的操作儘量批量操作,能壓縮的壓縮,能分區的分區存儲。
  5. 管理庫的統計信息,合理安排統計信息收集時間,調成平行數量。
  6. 監控日常的軟硬件性能,如 CPU、內存、磁盤 I/O、網絡等。根據監控結果調整數據庫參數、優化數據類型和索引等,以提高性能。
  7. 定期檢查和升級 TiDB 數據庫軟件和硬件,確保其處於最新狀態,可以提高性能和穩定性。

方法 8

貢獻者:@清風明月

1.版本信息 select tidb_version(); 2.查看數據庫 show databases; 3.創建數據庫 create database tidb; 4.進入數據庫 user tidb; 5.查看錶 show tables; 6.鏈接查詢 show processlist; 7.開啓角色 set role all; 8.查看角色 select current_role(); 9.查看授權 show grants

✨感謝大家貢獻的數據庫性能優化小技巧~

記得點贊收藏,可以隨時在你的個人收藏夾裏查看到~

未來我們將繼續發佈更多來自社區的精品內容,希望能爲大家提供更多有價值的信息和經驗。如果您有任何感興趣的話題,可以在下方留言,我們會整理相關的資料與大家分享哦!

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