MySQL8.0 view導致的效能問題
最近將5.7的開發測試環境升級到了8.0,開發測試同學反饋在執行ddl的時候變慢了,並反饋5.7 是正常的,要看下原因,所以對8.0的程式碼進行下分析,期間走了很多彎路,浪費了不少的時間。在這裡介紹下正確的分析問題思路。
首先對alter的語句執行流程不清楚,所以也不清楚在哪裡打斷點,如果從一開始斷電debug,無疑會浪費很多時間。所以正確的思路是使用mysql的trace功能,將sql 的執行過程全部記錄下來,然後分析trace,在trace中找對應的函式
./mysqld --debug=d,info,error,query,general,where:O,/tmp/mysqld.trace
在trace中找到可疑函式後,然後在函式處打斷點,debug,透過分析trace,可以看到有很多的check_table_acess,將檢視的每個基表都開啟進行了check_table_acess,所以這個檢視如果包含了很多的表,alter就會很慢。
下面是8.0的sql 堆疊
mysqld!check_table_access(THD*, unsigned long, TABLE_LIST*, bool, unsigned int, bool) (/Users/xiaoyu.bai/Downloads/mysql-8.0.23/sql/auth/sql_authorization.cc:2387) mysqld!parse_view_definition(THD*, TABLE_LIST*) (/Users/xiaoyu.bai/Downloads/mysql-8.0.23/sql/sql_view.cc:1362) mysqld!open_table(THD*, TABLE_LIST*, Open_table_context*) (/Users/xiaoyu.bai/Downloads/mysql-8.0.23/sql/sql_base.cc:3262) mysqld!open_and_process_table(THD*, LEX*, TABLE_LIST*, unsigned int*, Prelocking_strategy*, bool, Open_table_context*) (/Users/xiaoyu.bai/Downloads/mysql-8.0.23/sql/sql_base.cc:5018) mysqld!open_tables(THD*, TABLE_LIST**, unsigned int*, unsigned int, Prelocking_strategy*) (/Users/xiaoyu.bai/Downloads/mysql-8.0.23/sql/sql_base.cc:5805) mysqld!open_views_and_update_metadata(THD*, std::__1::vector<TABLE_LIST*, std::__1::allocator<TABLE_LIST*> > const*, bool, Uncommitted_tables_guard*) (/Users/xiaoyu.bai/Downloads/mysql-8.0.23/sql/dd_sql_view.cc:483) mysqld!bool update_view_metadata<dd::View_table>(THD*, char const*, char const*, bool, Uncommitted_tables_guard*) (/Users/xiaoyu.bai/Downloads/mysql-8.0.23/sql/dd_sql_view.cc:716) mysqld!update_referencing_views_metadata(THD*, char const*, char const*, char const*, char const*, bool, Uncommitted_tables_guard*) (/Users/xiaoyu.bai/Downloads/mysql-8.0.23/sql/dd_sql_view.cc:733) mysqld!update_referencing_views_metadata(THD*, TABLE_LIST const*, char const*, char const*, bool, Uncommitted_tables_guard*) (/Users/xiaoyu.bai/Downloads/mysql-8.0.23/sql/dd_sql_view.cc:753) mysqld!update_referencing_views_metadata(THD*, TABLE_LIST const*, bool, Uncommitted_tables_guard*) (/Users/xiaoyu.bai/Downloads/mysql-8.0.23/sql/dd_sql_view.cc:762) mysqld!mysql_inplace_alter_table(THD*, dd::Schema const&, dd::Schema const&, dd::Table const*, dd::Table*, TABLE_LIST*, TABLE*, TABLE*, Alter_inplace_info*, enum_alter_inplace_result, Alter_table_ctx*, std::__1::set<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, Stateless_allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, histograms::Histogram_psi_key_alloc, My_free_functor> >&, FOREIGN_KEY*, unsigned int, Foreign_key_parents_invalidator*) (/Users/xiaoyu.bai/Downloads/mysql-8.0.23/sql/sql_table.cc:13219) mysqld!mysql_alter_table(THD*, char const*, char const*, HA_CREATE_INFO*, TABLE_LIST*, Alter_info*) (/Users/xiaoyu.bai/Downloads/mysql-8.0.23/sql/sql_table.cc:16910) mysqld!Sql_cmd_alter_table::execute(THD*) (/Users/xiaoyu.bai/Downloads/mysql-8.0.23/sql/sql_alter.cc:349) mysqld!mysql_execute_command(THD*, bool) (/Users/xiaoyu.bai/Downloads/mysql-8.0.23/sql/sql_parse.cc:4407) mysqld!dispatch_sql_command(THD*, Parser_state*) (/Users/xiaoyu.bai/Downloads/mysql-8.0.23/sql/sql_parse.cc:4988) mysqld!dispatch_command(THD*, COM_DATA const*, enum_server_command) (/Users/xiaoyu.bai/Downloads/mysql-8.0.23/sql/sql_parse.cc:1836) mysqld!do_command(THD*) (/Users/xiaoyu.bai/Downloads/mysql-8.0.23/sql/sql_parse.cc:1320) mysqld!handle_connection(void*) (/Users/xiaoyu.bai/Downloads/mysql-8.0.23/sql/conn_handler/connection_handler_per_thread.cc:301) mysqld!pfs_spawn_thread(void*) (/Users/xiaoyu.bai/Downloads/mysql-8.0.23/storage/perfschema/pfs.cc:2900) libsystem_pthread.dylib!_pthread_start (Unknown Source:0)
下面看下5.7的處理邏輯,可以看到5.7上並沒有去檢查檢視相關的操作,也沒有去開啟檢視中的表並進行許可權的檢查。所以升級後,mysql8執行alter的速度比5.7慢
mysqld!MYSQL_BIN_LOG::gtid_end_transaction(THD*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/binlog.cc:1513) mysqld!binlog_gtid_end_transaction(THD*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_parse.cc:2428) mysqld!mysql_execute_command(THD*, bool) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_parse.cc:5096) mysqld!mysql_parse(THD*, Parser_state*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_parse.cc:5584) mysqld!dispatch_command(THD*, COM_DATA const*, enum_server_command) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_parse.cc:1491) mysqld!do_command(THD*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_parse.cc:1032) mysqld!::handle_connection(void *) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/conn_handler/connection_handler_per_thread.cc:313) mysqld!::pfs_spawn_thread(void *) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/storage/perfschema/pfs.cc:2197) libsystem_pthread.dylib!_pthread_start (Unknown Source:0) libsystem_pthread.dylib!thread_start (Unknown Source:0)
有興趣學習原始碼的加群一起學習啊 QQ: 700072075
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25719946/viewspace-2897154/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ANALYZE導致的阻塞問題分析
- 壞程式碼導致的效能問題大賞:CPU佔用飆到了900%!
- golang slice使用不慎導致的問題Golang
- CAS導致的ABA問題及解決
- 分散式鎖導致的超賣問題分散式
- MySQL8.0的一個bug導致複製延時MySql
- shell 中的 set -e 導致的退出問題
- Oracle優化案例-join列索引缺失導致的sql效能問題(二十六)Oracle優化索引SQL
- 如何使用SAP HANA Studio的PlanViz分析CDS view效能問題View
- 關於 Laravel mix 導致 Bootstrap 失效的問題Laravelboot
- str_replace導致的注入問題彙總
- [20191204]sqlplus特殊定義導致的問題.txtSQL
- vue的scope導致樣式修改不了問題Vue
- EfCore3的OwnedType會導致Sql效率問題SQL
- oracle 序列值導致的主鍵衝突問題Oracle
- 【爬坑】.Net編譯環境導致的問題編譯
- ARC下的block導致的迴圈引用問題解析BloC
- Vmware相容問題導致電腦藍屏
- Optional 的使用會導致效能下降嗎?
- 網路問題導致更多的資料中心中斷
- 在https中引入http資源所導致的問題HTTP
- c++臨時物件導致的生命週期問題C++物件
- 未使用 `deleteLater` 而直接使用 `delete` 導致問題delete
- chorme自動升級導致跨域問題ORM跨域
- 線上問題排查:記一次 Redis Cluster Pipeline 導致的死鎖問題Redis
- 過分標準化可要小心,這樣做可能會導致效能上出現問題。
- MySQL8.0的caching_sha2_password問題MySql
- WPF App後臺檔案彈窗導致奇怪的問題APP
- MySQL:一次timestamp時區轉換導致的問題MySql
- 關於 iconv 轉碼導致資料丟失的問題
- 記一次 Mac 意外重啟導致的 Homestead 問題Mac
- 使用資料庫處理併發可能導致的問題資料庫
- 記錄一次fs配置導致串線的問題
- 記一次儲存問題導致的rac故障案例
- xxl-job濫用netty導致的問題和解決方案Netty
- 資料庫管理-第118期 記一次開啟附加日誌導致的效能問題(202301129)資料庫
- 【epoll問題】EPOLLRDHUP使用導致無法接受資料
- WebMagic多執行緒導致註解失效問題Web執行緒