相同查詢在不同RDS for MySQL的性能差異

2020-11-23 IT168

  【IT168 技術】相同查詢在數據量相近的情況下在不同 RDS for MySQL 實例上有不同的性能表現,容易引發用戶對 RDS for MySQL 實例的性能差異性的疑慮,本文分享下近期碰到的一個原因比較隱蔽但很常見的案例。

  1. 問題出現

  一個用戶的下述查詢在 RDS for MySQL 實例 A 上執行需要 30+ 毫秒,而在 RDS for MySQL 實例 B 執行需要 12+ 秒。

  2. 問題原因

  排查 SQL 在 RDS for MySQL 實例 A 和 B 上的執行計劃,發現不一致。執行時間短 - A:

  執行時間長 - B:

  從執行計劃對比看問題出現在 表 A 和 中間表 B 關聯這步。

  執行計劃 B 的 Extra 信息顯示 Using join buffer (Block Nested Loop),說明如果選擇單純的 Nested Loop Join 成本會很高(在內層循環無法使用索引的場景下,成本是 O(Rn x Sn))。

  優化器為了提高效率,因此選擇了 Block Nested Loop。

  對比執行計劃 A,內層使用的索引是 MySQL 自動創建的(auto_key1),檢查優化器開關配置是否有區別,以防萬一。

  對比兩個實例優化器開關配置相同,且 materialization 和 subquery_materialization_cost_based 都已經打開, 加之執行計劃 B 中有物化表的使用,因此排除掉優化器開關配置問題。

  此時問題就比較明朗了,應該是關聯的兩個欄位類型不匹配,導致無法通過索引物化臨時表的關聯欄位來使用 Nested Loop Join。

  帶著上面的懷疑檢查下兩個實例的表 Pay 和 inv_msg 的關聯欄位 PayId 的欄位類型。

  可以看到 payId 欄位在執行快場景下 2 個表都是 big int 類型;而在執行慢的場景下,2個表的欄位類型分別為 big int 和 varchar,導致執行計劃選擇了對無法使用索引場景優化的 Block Netsted Loop。

  3. 問題解決

  理清問題的根源,就有了針對性的方法。建議用戶修改 表 inv_msg 的欄位 payid 類型為 big int not null,重新收集統計信息後問題解決。

4. 問題結論

  需要嚴格遵守規範進行開發工作。

  用戶 DBA 應該進行 SQL 審核工作。

相關焦點

  • mysql 版本號解釋_mysql workbench查詢mysql版本號 - CSDN
    比如性能。事實上我們經常會為了性能而妥協資料庫的設計。mysql有關權限的表都有哪幾個MySQL伺服器通過權限表來控制用戶對資料庫的訪問,權限表存放在mysql資料庫裡,由mysql_install_db腳本初始化。這些權限表分別user,db,table_priv,columns_priv和host。
  • 一條查詢SQL在MySQL中是怎麼執行的
    不同的存儲引擎的表數據存取方式不同,支持的功能也不相同,以後我們再慢慢分析。從圖中我們可以看到Server層由多個組件,從連接器開始到執行器,接下來我們使用一條簡單的查詢語句,來依次分析每個組件的作用。
  • mysql查詢前一周的數據_mysql查詢當天的數據 - CSDN
    mysql 昨天 一周前 一月前 一年前的數據 這裡主要用到了DATE_SUB,參考如下代碼如下:SELECT * FROM
  • MySQL 8.0 正式版 8.0.11 發布:比 MySQL 5.7 快 2 倍
    性能:MySQL 8.0 的速度要比 MySQL 5.7 快 2 倍。MySQL 8.0 在以下方面帶來了更好的性能:讀/寫工作負載、IO 密集型工作負載、以及高競爭("hot spot"熱點競爭問題)工作負載。
  • MySQL 5.7 vs 8.0,哪個性能更牛?
    背景 測試mysql5.7和mysql8.0 分別在讀寫、只讀、只寫模式下不同並發時的性能(tps,qps) 前提 測試使用版本為mysql5.7.22和mysql8.0.15 sysbench
  • MySQL如何實時同步數據到ES?試試這款阿里開源的神器
    由於不同版本的MySQL、Elasticsearch和canal會有兼容性問題,所以我們先對其使用版本做個約定。canal的各個組件的用途各不相同,下面分別介紹下: canal-server(canal-deploy):可以直接監聽MySQL的binlog,把自己偽裝成MySQL的從庫,只負責接收數據,並不做處理。
  • mysql/mariadb資料庫在查詢結果中再次查詢篩選的操作方法
    今天是2020年4月9日,我跟大家分享一個二次操作mysql資料庫查詢結果的方法.我以資料庫 mariadb為例進行說明.因為它有個heidiSQL圖形管理工具,比較好操作.資料庫 mariadb為例進行說明.因為它有個heidiSQL圖形管理工具,比較好操作.
  • MySQL 8.0 正式版 8.0.11 發布:比 MySQL 5.7 快 2 倍 - OS...
    性能:MySQL 8.0 的速度要比 MySQL 5.7 快 2 倍。MySQL 8.0 在以下方面帶來了更好的性能:讀/寫工作負載、IO 密集型工作負載、以及高競爭("hot spot"熱點競爭問題)工作負載。
  • MySQL字符串截取 和 截取字符進行查詢
    通過mysql自帶的一些字符串截取函數,對數據進行處理,下面是我整理的字符串截取 和 截取字符進行查詢。substring_index("aaa_bbb_ccc","_",2) ,返回為 aaa_bbb;substring_index(substring_index("aaa_bbb_ccc","_",-2),"_",1) ,返回為 bbb;2.concat是連接幾個字符串 例子:concat(『m』,』y』,’s』,』q』,』l』); 返回:mysql
  • canal 1.1.2 發布,阿里 MySQL Binlog 增量訂閱&消費組件
    canal 1.1.2 已發布,更新內容如下:功能新增支持mysql8.0的binlog解析 【BinlogChange(MySQL8
  • MySQL 數據校驗工具-愛可生|mysql|perl|伺服器|node01_網易訂閱
    其原理是在主庫執行基於 statement 的 SQL 語句來生成主庫數據塊的checksum,把相同的 SQL 語句傳遞到從庫執行,並在從庫上計算相同數據塊的 checksum,最後,比較主從庫上相同數據塊的 checksum 值,由此判斷主從數據是否一致。它能在非常大的表上工作的一個原因是,它把每個表分成行塊,並檢查每個塊與單個替換。選擇查詢。它改變塊的大小,使校驗和查詢在所需的時間內運行。
  • mysql查詢——統計每日新用戶數量
    下圖是一張網站用戶活動表(User_Activities),表中包含欄位UserId(用戶編號)、Activity(用戶活動,可取值login、orders、logout)、Date(活動日期),現需要編寫一個查詢語句,統計網站每日的新用戶數量,即統計每日登錄用戶中首次登錄網站的用戶數
  • mysql昨天的日期時間函數 - CSDN
    mysql時間日期內置函數–非常方便用於查詢今天、昨天、上周,本月,上月,年度查詢等,但是千萬要監控mysql語句的性能,適當加索引優化一下查詢速度哦今天select * from 表名 where to_days(時間欄位名) = to_days(now());
  • 一千行MySQL學習筆記
    ,結構不同會導致處理方式、提供的特性操作等不同        常見的引擎:InnoDB MyISAM Memory/Heap BDB Merge Example CSV MaxDB Archive        不同的引擎在保存表的結構和數據時採用不同的方式        MyISAM表文件含義:.frm表定義,.MYD表數據,.MYI表索引        InnoDB
  • 基於MySQL資料庫應用開發實現嵌入式數控系統的設計
    這些數據的組織管理方式對數控系統的實時性乃至性能影響很大,因此高性能數控系統必須解決數據的有效性組織管理問題。如果採用直接將數據存放在一個表或字符數組中,數據的修改與維護會相當困難、繁雜,這與數控系統對數據操作要求簡單方便與快捷相悖,因此這種組織管理方式不能滿足數控系統的要求。
  • (Mysql優化系列3)
    最終結果圖如下相比較紅黑樹他的高度只有2,查詢速度更快。B-樹因此具有以下幾個特點:1)、葉節點具有相同的深度,葉節點的指針為空2)、所有索引元素不重複3)、節點中的數據索引從左到右遞增排列看完數據結構,我們看B樹做索引的結構又如何呢,mysql默認索引節點為16KB,當然可以修改大小。
  • 高性能Mysql主從架構的複製原理及配置詳解
    如果因為mysql版本新舊密碼算法不同,可以設置:拷貝數據:(假如是你完全新安裝mysql主從伺服器,這個一步就不需要。因為新安裝的master和slave有相同的數據)關停Master伺服器,將Master中的數據拷貝到B伺服器中,使得Master和slave中的數據同步,並且確保在全部設置操作結束前,禁止在Master和slave伺服器中進行寫操作,使得兩資料庫中的數據一定要相同!
  • python3.8操作(插入,刪除)mysql/MariaDB資料庫
    03python代碼部分#pip install mysql-connectorimport mysql.connectorimport time# INSERT INTO public.a1(# name, age)# VALUES ('金源', 37);# ALTER TABLE a1 ADD COLUMN id SERIAL PRIMARY KEY;mydb
  • 如何在ubuntu20.04安裝MySQL並修改資料庫密碼
    sudo apt install mysql-client-core-83、再次輸入mysql命令,提示不能連接上mysql server,由提示可知mysql服務端沒有安裝;輸入命令sudo apt-get
  • MySQL 5.7和MySQL 8.0的4個細節差異
    如果要說MySQL 5.7升級到MySQL 8.0的一些差異,從我的角度來說,其實變化是很大的,但是細數盤點,很多特性似乎是對於業務的一種友好或者透明支持。比如我們在MySQL 5.7版本中全面推行GTID,所以之前的create table xxx as select * from xx的使用模式就不奏效了,進而我們建議使用:create table xxx like xxxxx;insert into xxx select * from xxxxx;這種使用模式,而MySQL8.0帶來的很多特性是在體驗和性能改造方面