GaussDB(for MySQL)剪枝功能,讓查詢性能提升70倍!

来源:https://www.cnblogs.com/huaweiyun/p/17994396
-Advertisement-
Play Games

作者,祝青平,華為雲資料庫內核高級工程師。擅長資料庫優化器內核研發,9年資料庫內核研發經驗,參與多個TP以及AP資料庫的研發工作。 近日,華為雲資料庫社區下麵有這樣一條用戶提問留言:請問,如何通過MySQL提升DISTINCT,尤其是多表連接下DISTINCT的查詢效率? 在回答這個問題之前,我們先 ...


作者,祝青平,華為雲資料庫內核高級工程師。擅長資料庫優化器內核研發,9年資料庫內核研發經驗,參與多個TP以及AP資料庫的研發工作。

近日,華為雲資料庫社區下麵有這樣一條用戶提問留言:請問,如何通過MySQL提升DISTINCT,尤其是多表連接下DISTINCT的查詢效率?

在回答這個問題之前,我們先瞭解一下DISTINCT。

在SQL語句中,DISTINCT關鍵詞用於返回唯一不同的值,使用場景多,應用頻繁。它可以用於做單列數據去重,例如,對公司雇員按照”first_name”去重後,得到1275條記錄。

cke_138.png

也可以做多列去重,即只有所有指定列的信息都相同時,才會被認為是重覆的信息,例如,對公司雇員按照”first_name”和”gender”兩列去重後得到2550條記錄。

cke_139.png

對於“多表連接+DISTINCT”場景,MySQL 8.0需要掃描表連接後的結果。當表連接數量多或基表數據量大時,掃描的數據量也會很大,會導致執行效率很低。如下示例,對7個表連接後的結果做DISTINCT,使用MySQL 8.0.30社區版本,執行耗時186秒,通過查看慢日誌信息,發現掃描了約4400萬行數據。

cke_140.png

cke_141.png

為了提升DISTINCT,尤其多表連接下DISTINCT的查詢效率,GaussDB(for MySQL)在執行優化器中加入了剪枝功能,可以去除不必要的掃描分支,節省查詢耗時。

GaussDB(for MySQL)剪枝方案

以下麵的SQL執行為例,表t1有4行數據1,2,5,6。執行如下多表連接+DISTINCT:

cke_142.png

表連接執行邏輯如下:

cke_143.png

上述例子中,在MySQL 8.0.30社區版本執行器需要掃描60行數據才能獲得結果集。找到滿足條件的唯一結果{i=1,j=2,k=5}後,不會停止本輪掃描,而是繼續掃描{i=1,j=5,k=1}及後續無用的數據,導致執行時間長。詳細的執行流程參見下圖:

cke_144.png

針對如上的多表連接+DISTINCT執行效率慢的問題,GaussDB(for MySQL)在火山模型的執行器上實現了提前減枝優化,當找到滿足的條件的DISTINCT值之後,通過全局變數判斷是否可以提前結束本輪迭代,並層層退出,大幅減少了掃描工作量。

以上述SQL為例,在掃描{1,1,1},{1,1,2},{1,1,5},{1,1,8},{1,2,1},{1,2,2},{1,2,5} 7組數據後,找到滿足DISTINCT 條件值 tt1.a "1",立即結束本輪迭代,並停止上一層迭代。該例子中只需要掃描28行數據就可獲得最終結果集,相比MySQL 8.0社區版本掃描60行,GaussDB(for MySQL)性能顯著提升。

cke_145.png

GaussDB(for MySQL)剪枝特性使用方法

打開特性開關:SET rds_nlj_distinct_optimize=ON;

通過”EXPLAIN FORMAT=TREE”查看特性是否生效,執行計劃中出現” join with distinct optimization”關鍵字說明特性生效,查詢過程中可進行減枝優化,提升多表JOIN+DISTINCT執行效率。

cke_146.png

cke_147.png

GaussDB(for MySQL)剪枝典型場景測試對比

前面提到的測試樣例中,GaussDB(for MySQL)執行耗時2.7秒完成,只需要掃描數據量約61萬行;相比MySQL 8.0 社區版本執行耗時約186秒,掃描數據量4400萬,執行耗時和掃描數據量減少近70倍,實現了執行效率飛躍式提升。如下圖所示:

cke_148.png

cke_149.png

因此,針對“多表連接+DISTINCT”的場景,GaussDB(for MySQL)在執行過程中動態剪枝,裁剪掉大量無用數據,減少執行過程中掃描數據量,是提升查詢效率的秘密武器。

總結:

以上通過對GaussDB(for MySQL)剪枝方案、剪枝特性使用方法、典型場景測試對比結果的詳細呈現,剖析了“多表連接+DISTINCT”場景中,GaussDB(for MySQL)大幅提升查詢效率的原因。如果對華為雲GaussDB(for MySQL)更多功能感興趣的話,可以查看官方產品文檔,瞭解更多:https://support.huaweicloud.com/gaussdbformysql/index.html

 

點擊關註,第一時間瞭解華為雲新鮮技術~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MySQL Shell 8.0.32 for GreatSQL編譯二進位包 構建MySQL Shell 8.0.32 for GreatSQL 0. 寫在前面 之前已經寫過一篇前傳 MySQL Shell 8.0.32 for GreatSQL編譯安裝,最近再次編譯MySQL Shell二進位包時, ...
  • 北京時間2024年2月20日,中國領先的開源技術公司,白鯨開源科技有限公司(以下簡稱"白鯨開源")榮幸宣佈,該公司獲得了第六屆 "年度金猿季大型主題策劃活動" 頒發的 "2023大數據產業年度最具投資價值" 獎項。這一殊榮是對白鯨開源在大數據領域取得的卓越成就和突出貢獻的認可。 金猿季推動產業升級 ...
  • 本文深度解析MySQL的COUNT(1), COUNT(*),COUNT(列)計數方式,強調COUNT(*)的廣泛應用與InnoDB存儲引擎的優化。通過性能比較,揭示COUNT(id)在索引下的性能,通過技術細節揭示MySQL查詢優化器的工作原理,最終總結適用場景,為讀者提供計數方式選擇的指導。 ...
  • 目錄MongoDB創建一張表用法示例資料分享系列文章clickhouse系列文章 MongoDB MongoDB 引擎是只讀表引擎,允許從遠程 MongoDB 集合中讀取數據(SELECT查詢)。引擎只支持非嵌套的數據類型。不支持 INSERT 查詢。 創建一張表 CREATE TABLE [IF ...
  • 工商銀行和華為雲牽頭,並聯合7家金融機構共同編製的《金融行業開放平臺資料庫轉型白皮書》榮獲2023年度十佳課題。 ...
  • 優秀的程式應該儘可能地規避問題。因此,以後在服務商系統里,當定義包含漢字的欄位時,使用 nvarchar2,而非 varchar2。 因此,在服務商系統作為我司系統的小眾系統的背景下,Oracle的技術特性我們不一一曉知是可以理解和接受的。而如何在不一一曉知這些技術特性的情況下,能夠規避這些技術特性... ...
  • 環境 MySQL 5.7 非GTID模式多線程複製。 現象 某MySQL資料庫從節點因故障宕機(因故障直接宕機,非正常關閉),重啟之後發現複製狀態異常,show slave的結果中Slave_SQL_Running為No,錯誤代碼為1062 error code,從系統表performance_sc ...
  • 一、為什麼要做診斷引擎 毓數平臺是奇富科技公司自主研發的一站式大數據管理、開發、分析平臺,覆蓋大數據資產管理、數據開發及任務調度、自助分析及可視化、統一指標管理等多個數據生命周期流程,讓用戶使用數據的同時,挖掘數據最大的價值。而毓數平臺的大數據任務調度底層是基於Apache DolphinSched ...
一周排行
    -Advertisement-
    Play Games
  • 在C#中使用SQL Server實現事務的ACID(原子性、一致性、隔離性、持久性)屬性和使用資料庫鎖(悲觀鎖和樂觀鎖)時,你可以通過ADO.NET的SqlConnection和SqlTransaction類來實現。下麵是一些示例和概念說明。 實現ACID事務 ACID屬性是事務處理的四個基本特征, ...
  • 我們在《SqlSugar開發框架》中,Winform界面開發部分往往也用到了自定義的用戶控制項,對應一些特殊的界面或者常用到的一些局部界面內容,我們可以使用自定義的用戶控制項來提高界面的統一性,同時也增強了使用的便利性。如我們Winform界面中用到的分頁控制項、附件顯示內容、以及一些公司、部門、菜單的下... ...
  • 在本篇教程中,我們學習瞭如何在 Taurus.MVC WebMVC 中進行數據綁定操作。我們還學習瞭如何使用 ${屬性名稱} CMS 語法來綁定頁面上的元素與 Model 中的屬性。通過這些步驟,我們成功實現了一個簡單的數據綁定示例。 ...
  • 是在MVVM中用來傳遞消息的一種方式。它是在MVVMLight框架中提供的一個實現了IMessenger介面的類,可以用來在ViewModel之間、ViewModel和View之間傳遞消息。 Send 接受一個泛型參數,表示要發送的消息內容。 Register 方法用於註冊某個對象接收消息。 pub ...
  • 概述:在WPF中,通過EventHandler可實現基礎和高級的UI更新方式。基礎用法涉及在類中定義事件,併在UI中訂閱以執行更新操作。高級用法藉助Dispatcher類,確保在非UI線程上執行操作後,通過UI線程更新界面。這兩種方法提供了靈活而可靠的UI更新機制。 在WPF(Windows Pre ...
  • 概述:本文介紹了在C#程式開發中如何利用自定義擴展方法測量代碼執行時間。通過使用簡單的Action委托,開發者可以輕鬆獲取代碼塊的執行時間,幫助優化性能、驗證演算法效率以及監控系統性能。這種通用方法提供了一種便捷而有效的方式,有助於提高開發效率和代碼質量。 在軟體開發中,瞭解代碼執行時間是優化程式性能 ...
  • 概述:Cron表達式是一種強大的定時任務調度工具,通過配置不同欄位實現靈活的時間規定。在.NET中,Quartz庫提供了簡便的方式配置Cron表達式,實現精準的定時任務調度。這種靈活性和可擴展性使得開發者能夠根據需求輕鬆地制定和管理定時任務,例如每天備份系統日誌或其他重要操作。 Cron表達式詳解 ...
  • 概述:.NET提供多種定時器,如System.Windows.Forms.Timer適用於UI,System.Web.UI.Timer用於Web,System.Diagnostics.Timer用於性能監控,System.Threading.Timer和System.Timers.Timer用於一般 ...
  • 問題背景 有同事聯繫我說,在生產環境上,訪問不了我負責的common服務,然後我去檢查common服務的health endpoint, 沒問題,然後我問了下異常,timeout導致的System.OperationCanceledException。那大概率是客戶端的問題,會不會是埠耗盡,用ne ...
  • 前言: 在本篇 Taurus.MVC WebMVC 入門開發教程的第四篇文章中, 我們將學習如何實現數據列表的綁定,通過使用 List<Model> 來展示多個數據項。 我們將繼續使用 Taurus.Mvc 命名空間,同時探討如何在視圖中綁定並顯示一個 Model 列表。 步驟1:創建 Model ...