數據庫性能優化的目標是通過充分利用系統資源來最小化查詢的響應時間。對這些資源的最佳利用包括最大限度地減少網絡流量、磁盤 I/O 和 CPU 時間。這個目標只能通過理解數據的邏輯和物理結構、系統上使用的應用程序以及數據庫的沖突使用如何影響性能來實現。實際上,數據庫性能優化是一項系統工程,需要使用系統化分析方法,從硬件、軟件和應用場景等多個相關聯的維度深入分析、評估與優化,在數據庫系統的架構階段、設計階段、開發階段、部署階段、運行階段等各環節中去尋找性能問題的瓶頸和解決方案。
本文精選了HeapDump性能社區中的8篇數據庫性能優化相關文章,這些文章內不僅包含了影響數據庫性能的因素,數據庫性能評估標准、優化方法的內容,還介紹了一些數據庫設計原則和編程技巧,並且記錄了一些或大或小的實戰案例,幫助大家快速了解數據庫性能優化,掌握一些實操技能。
1.帶你重走 TiDB TPS 提升 1000 倍的性能優化之旅
作者:TiDB_Robot
作者介紹:TiDB是一個開源的NewSQL數據庫,支持混合事務和分析處理(HTAP)工作負載。它與MySQL兼容,並且可以提供水平可擴展性、強一致性和高可用性。它主要由PingCAP公司開發和支持,並在Apache 2.0下授權。TiDB現已正式入駐HeapDump性能社區,未來將會分享更多數據庫性能優化相關的優質文章。
文章鏈接:https://heapdump.cn/article/3021827
精彩導讀:性能優化這個事情核心只有一句話,用戶響應時間去哪兒了?性能優化很困難的原因在於,為了定位用戶響應時間在各個模塊的分布,需要對系統的各個部件進行測量和分析,從底層硬件,CPU、IO、網絡到上層應用架構,應用代碼跟數據庫的交互方式都需要涉及。本文第一部分介紹了一下性能優化的通用的方法,第二部分講了一個實際案例。
用戶響應時間
性能優化的第一個概念是用戶響應時間。用戶響應時間是用戶在使用一個業務系統的時候,發起一個請求,這個請求返回總體消耗的時間為用戶響應時間。一個典型的用戶響應時間的分布如下圖:
從時序圖看,一個用戶響應時間可能包括:
1.用戶請求的到達應用服務器的網絡時間
2.應用服務器本身業務邏輯處理時間
3.應用服務器跟數據庫服務器之間交互消耗的網絡的時間
4.數據庫多次處理 SQL 的時間
5.應用服務器返回用戶數據的網絡時間
整個鏈路上來看,會涉及到網絡、應用服務器和數據庫這幾個重要的部件。只要知道戶響應時間在每個模塊的分布,我們就能定位瓶頸,進行針對性的優化。
現實中性能瓶頸的定位又非常難。因為絕大部分的應用都沒有去部署 APM 之類的工具,能夠去跟蹤一個應用請求在全鏈路上面的時間消耗。大部分場景的性能優化工作,都是在缺乏全局的時間分布情況下進行的。我們推薦的一種可靠的性能優化的方法:基於數據庫時間進行性能優化。
數據庫時間
數據庫時間為單位時間內數據庫提供的服務時間。對比數據庫時間和應用總的用戶響應時間,可以判斷應用系統的瓶頸是否在數據庫中。
一個應用系統,ΔT 時間內提供的總的服務時間,可以拿平均業務的 TPS 乘以平均的響應時間。ΔT 時間內的數據庫時間,有多種算法:
1.平均 TPS X 平均事務延遲 X ΔT
2.平均的 QPS X 平均的延遲 X ΔT
3.平均的活躍連接數 X ΔT, 下圖數據庫活躍連接圖的面積即為數據庫時間
基於數據庫時間和用戶響應時間的對比,先從全局的角度判斷瓶頸在數據庫里面還是在數據庫的外面,然后再進行針對性的排查和優化。把數據庫時間除以總的用戶響應時間:
趨近 0,數據庫時間在總的服務時間里面是很小的占比,說明瓶頸並不在數據庫中。
趨近 1,說明整個應用系統瓶頸是在數據庫里面。工程師通過降低數據庫時間來進行性能優化,比如優化 SQL 執行計划、解決數據庫中存在的熱點爭用等。
2.5G時代,如何徹底搞定海量數據庫的設計與實踐
作者:孫玄|奈學教育
作者介紹:孫玄,現任奈學教育科技創始人&CEO ,畢業於浙大,前百度資深研發工程師、前 58 集團技術委員會主席/高級系統架構師到前轉轉公司技術委員會主席/首席架構師/大中后台技術負責人。江湖人稱“玄姐”,出版過《百萬年薪架構師修煉之路》書籍。
文章鏈接:https://heapdump.cn/article/761671
精彩導讀:5G時代,業務數據越來越豐富,業務使用MySQL數據庫作為后台存儲,存儲引擎使用InnoDB,會帶來哪些挑戰?如何針對公司業務特點及MySQL數據庫特性,制定若干數據庫使用規范供一線RD在設計業務時參考部分內容要求強制執行。本文從介紹MySQL相關關鍵基礎架構,並結合實際案例介紹表和索引的設計技巧,並對規范中重點內容做詳細解讀。
小結:
1.自增主鍵性能不一定高,需要結合實際業務場景做分析;
2.大多數場景數據類型選擇上盡量使用簡單的類型;
3.索引不是越多越好,太多的索引會導致過大的索引文件;
4.如果要查詢的數據可以在索引文件中找到,存儲引擎就不會查找主鍵索引訪問實際記錄。
3.Mysql的sql優化方法
作者:臆想的一只貓
文章鏈接:https://heapdump.cn/article/2994366
精彩導讀:本文總結了一些對mysql性能有利的編程技巧。
1、選擇最合適的字段屬性
2、盡量把字段設置為NOT NULL
3、使用連接(JOIN)來代替子查詢(Sub-Queries)
4、使用聯合(UNION)來代替手動創建的臨時表
5、事務
6、鎖定表
7、使用外鍵
8、使用索引
9、優化查詢語句
4.一些比較好的Redis性能優化思路總結
作者:劉思寧
文章鏈接:https://heapdump.cn/article/2871512
精彩導讀:在一些網絡服務的系統中,Redis 的性能,可能是比 MySQL 等硬盤數據庫的性能更重要的課題。比如微博,把熱點微博,最新的用戶關系,都存儲在 Redis 中,大量的查詢擊中 Redis,而不走 MySQL。那么,針對 Redis 服務,我們能做哪些性能優化呢?或者說,應該避免哪些性能浪費呢?那么,針對 Redis 服務,我們能做哪些性能優化呢?或者說,應該避免哪些性能浪費呢?
在討論優化之前,我們需要知道,Redis 服務本身就有一些特性,比如單線程運行。除非修改 Redis 的源代碼,不然這些特性,就是我們思考性能優化的基本面。首先,Redis 使用操作系統提供的虛擬內存來存儲數據。其次,Redis 支持持久化,可以把數據保存在硬盤上。第三,Redis 是用 key-value 的方式來讀寫的,而 value 中又可以是很多不同種類的數據;更進一步,一個數據類型的底層還有被存儲為不同的結構。最后,在上面的介紹中沒有提到的是,Redis 大多數時候是單線程運行的(single-threaded),即同一時間只占用一個 CPU,只能有一個指令在運行,並行讀寫是不存在的。
針對這些特性,概括了對Redis進行性能優化的幾個切入點:優化網絡延時;警惕執行時間長的操作;優化數據結構、使用正確的算法;考慮操作系統和硬件是否影響性能;考慮持久化帶來的開銷;使用分布式架構 —— 讀寫分離、數據分片。
5.千萬級數據表選錯索引導致的線上慢查詢事故
作者:后端技術漫談
文章鏈接:https://heapdump.cn/article/2166752
精彩導讀:最近在線上環境遇到了一次SQL慢查詢引發的數據庫故障,影響線上業務。經過排查后,確定原因是「SQL在執行時,MySQL優化器選擇了錯誤的索引(不應該說是“錯誤”,而是選擇了實際執行耗時更長的索引)」。在排查過程中,查閱了許多資料,也學習了下MySQL優化器選擇索引的基本准則,在本文中進行解決問題思路的分享。本人MySQL了解深度有限,如果錯誤歡迎理性討論和指正。在這次事故中也能充分看出深入了解MySQL運行原理的重要性,這是遇到問題時能否獨立解決問題的關鍵。
6.MySQL全面瓦解21(番外):一次深夜優化億級數據分頁的奇妙經歷
作者:翁智華
文章鏈接:https://heapdump.cn/article/2869483
精彩導讀:本次事故的情況是線上的一個查詢數據的接口被瘋狂的失去理智般的調用,這個操作直接導致線上的MySql集群被拖慢了。分析慢查詢日志后發現,其實對於我們的MySQL查詢語句來說,整體效率還是可以的,該有的聯表查詢優化都有,該簡略的查詢內容也有,關鍵條件字段和排序字段該有的索引也都在,問題在於他一頁一頁的分頁去查詢,查到越后面的頁數,掃描到的數據越多,也就越慢。這種查詢的慢,其實是因為limit后面的偏移量太大導致的。比如像上面的limit 2000000,25,這個等同於數據庫要掃描出 2000025條數據,然后再丟棄前面的 20000000條數據,返回剩下25條數據給用戶,這種取法明顯不合理。《高性能MySQL》第六章:查詢性能優化,對這個問題有過說明:分頁操作通常會使用limit加上偏移量的辦法實現,同時再加上合適的order by子句。但這會出現一個常見問題:當偏移量非常大的時候,它會導致MySQL掃描大量不需要的行然后再拋棄掉。
7.Redis 高負載下的中斷優化
作者:驍雄 春林
作者介紹:驍雄,14年加入美團點評,主要從事MySQL、Redis數據庫運維,高可用和相關運維平台建設。春林,17年加入美團點評,畢業后一直深耕在運維線,從網絡工程師到Oracle DBA再到MySQL DBA 多種崗位轉變,現在美大主要職責Redis運維開發和優化工作。
文章鏈接:https://heapdump.cn/article/2842148
精彩導讀:2017年年初以來,隨着Redis產品的用戶量越來越大,接入服 務越來越多,再加上美團點評Memcache和Redis兩套緩存融合,Redis服務端的總體請求量從年初最開始日訪問量百億次級別上漲到高峰時段的萬億次級別,給運維和架構團隊都帶來了極大的挑戰。原本穩定的環境也因為請求量的上漲帶來了很多不穩定的因素,其中一直困擾我們的就是網卡丟包問題。起初線上存在部分Redis節點還在使用千兆網卡的老舊服務器,而緩存服務往往需要承載極高的查詢量,並要求毫秒級的響應速度,如此一來千兆網卡很快就出現了瓶頸。經過整治,我們將千兆網卡服務器替換為了萬兆網卡服務器,本以為可以高枕無憂,但是沒想到,在業務高峰時段,機器也竟然出現了丟包問題,而此時網卡帶寬使用還遠遠沒有達到瓶頸。
8.記一次慢SQL優化
作者:艾小仙
作者介紹:艾小仙,前阿里P7技術專家。工作11年,做過開發、產品、運營,行業橫跨互聯網安全、電商、支付、金融、酒店、O2O等等,熱衷於分享大廠面試經驗、架構設計、中間件、算法、數據庫等熱門技術。微信公眾號【艾小仙】粉絲數10w+,曾被各大技術社區公眾號轉載推薦。
文章鏈接:https://heapdump.cn/article/3058836
精彩導讀:這是一個線上問題,從日志平台查詢到的 SQL 執行情況,該 SQL 執行的時間為 11.146s,可以認定為是一個慢查詢。整個情況來看,緩沖區大小、排序字段的數據長度、查詢數據條數等都會影響查詢性能。分析了整個排序過程,指導的優化思想就是盡量不使用using filesort,尤其是在排序的數據量比較大的時候,那么優化的方式就是盡量讓查詢出來的數據已經是排好序的,也就是合理使用聯合索引以及覆蓋索引。
有性能問題,找HeapDump性能社區