MySQL中怎么分析性能?

MySQL中主要有4種方式可以分析數據庫性能,分別是慢查詢日志,profile,Com_xxx和explain。

慢查詢日志

先用下面命令查詢慢查詢日志是否開啟,

show variables like 'slow_query_log';# 一般默認都是以下結果
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| slow_query_log | OFF   |
+----------------+-------+
  • 若結果為 ON,表示慢查詢日志已開啟;若為 OFF,則需要手動開啟。但是一般慢查詢日志是默認不開啟的,需要手動開啟,因為需要指定指標,也就是多慢的SQL才算慢SQL。

臨時開啟(重啟 MySQL 后失效):

# 開啟慢查詢日志
set global slow_query_log = 'ON';
# 設置一個時間,超過這個時間的查詢都會被認為是慢查詢,會記錄到慢查詢日志里,單位是秒(s)
set global long_query_time = 2;

永久開啟:

linux環境下只需要改一下/etc/my.cnf配置文件,在里面加入如下兩行配置

# 0:關閉慢查詢日志 1:開啟慢查詢日志
slow_query_log = 1  
# 指定日志文件路徑(可選,不選則有默認路徑)
slow_query_log_file = /var/log/mysql/slow.log
# 設置一個時間,超過這個時間的查詢都會被認為是慢查詢,會記錄到慢查詢日志里,單位是秒(s)
long_query_time = 2
# 是否記錄未使用索引的查詢(1表示開啟,0表示關閉,默認關閉)
log_queries_not_using_indexes = 1

關鍵是參數【slow_query_log】和【long_query_time】一定要設置,配置完畢保存后然后使用【systemctl restart mysqld】在Linux命令行重啟MySQL即可。此時慢查詢的日志會記錄到文件里,如果沒有配置路徑,使用到了默認路徑,可以查詢一下文件位置:

SHOW VARIABLES LIKE 'slow_query_log_file';# 得到結果可能如下
+---------------------+-------------------------------+
| Variable_name       | Value                         |
+---------------------+-------------------------------+
| slow_query_log_file | /var/lib/mysql/hostname-slow.log |
+---------------------+-------------------------------+

然后去指定目錄直接查看log文件即可。


profile

使用下列命令查看profiling是否開啟

show variables like 'profiling';# 默認是關閉的,一般查詢結果如下
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| profiling     | OFF   |
+---------------+-------+

需要手動開啟。

臨時開啟profiling(重啟 MySQL 后失效):

在SQL執行窗口設定參數

set profiling = 1;

永久開啟:

在/etc/my.cnf文件中加入如下配置

profiling = 1

要記得修改過/etc/my.cnf文件以后要重啟mysql。

此時隨便執行幾條sql,然后再來查詢一下profile。

# 此時為了測試我創建了一個表
# 執行下面幾條查詢
select * from test where id = 2;
select * from test where id = 1;
select * from test;# 執行下行語句,查詢Query記錄
show profiles;
# 得到如下結果,Query列是查詢語句,Duration是執行消耗的時間,Query_ID是記錄ID
+----------+------------+------------------------------------+
| Query_ID | Duration   | Query                              |
+----------+------------+------------------------------------+
|        1 | 0.00029275 | select * from test where id = 2    |
|        2 | 0.00022375 | select * from test where id = 1    |
|        3 | 0.00020425 | select * from test                 |
+----------+------------+------------------------------------+# 如果想要對某一條SQL進行分析,比如這里Query_ID為1的記錄消耗時間最長,想要看一下具體情況,可以使用如下命令
show profile for query 1;# 得到如下結果
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000115 |
| Executing hook on transaction  | 0.000008 |
| starting                       | 0.000009 |
| checking permissions           | 0.000005 |
| Opening tables                 | 0.000037 |
| init                           | 0.000004 |
| System lock                    | 0.000007 |
| optimizing                     | 0.000009 |
| statistics                     | 0.000045 |
| preparing                      | 0.000011 |
| executing                      | 0.000009 |
| end                            | 0.000002 |
| query end                      | 0.000002 |
| waiting for handler commit     | 0.000007 |
| closing tables                 | 0.000007 |
| freeing items                  | 0.000010 |
| cleaning up                    | 0.000007 |
+--------------------------------+----------+# 可以看到開始時間,執行時間,打開表的時間,優化時間,準備時間,關閉表的時間等參數
# 如果SQL查詢很慢的話則可以從這里分析原因

Com_%

# 執行下列命令
show status like 'Com_%'; # 得到結果格式如下
+-------------------------------------+-------+
| Variable_name                       | Value |
+-------------------------------------+-------+
| Com_admin_commands                  | 0     |
| Com_assign_to_keycache              | 0     |
| Com_alter_db                        | 0     |
| Com_alter_event                     | 0     |
| Com_alter_function                  | 0     |
| Com_alter_instance                  | 0     |
| Com_alter_procedure                 | 0     |
| Com_alter_resource_group            | 0     |
| Com_alter_server                    | 0     |
| Com_alter_table                     | 0     |
| Com_alter_tablespace                | 0     |
| Com_alter_user                      | 0     |
| Com_alter_user_default_role         | 0     |
| Com_analyze                         | 0     |
| Com_begin                           | 0     |
| Com_binlog                          | 0     |
| Com_call_procedure                  | 0     |
| Com_change_db                       | 1     |
| Com_change_master                   | 0     |
| Com_change_repl_filter              | 0     |
| Com_change_replication_source       | 0     |
| Com_check                           | 0     |
| Com_checksum                        | 0     |
| Com_clone                           | 0     |
| Com_commit                          | 0     |
| Com_create_db                       | 0     |
| Com_create_event                    | 0     |
| Com_create_function                 | 0     |
| Com_create_index                    | 0     |
| Com_create_procedure                | 0     |
| Com_create_role                     | 0     |
| Com_create_server                   | 0     |
| Com_create_table                    | 0     |
| Com_create_resource_group           | 0     |
| Com_create_trigger                  | 0     |
| Com_create_udf                      | 0     |
| Com_create_user                     | 0     |
| Com_create_view                     | 0     |
| Com_create_spatial_reference_system | 0     |
| Com_dealloc_sql                     | 0     |
| Com_delete                          | 0     |
| Com_delete_multi                    | 0     |
| Com_do                              | 0     |
| Com_drop_db                         | 0     |
| Com_drop_event                      | 0     |
| Com_drop_function                   | 0     |
| Com_drop_index                      | 0     |
| Com_drop_procedure                  | 0     |
| Com_drop_resource_group             | 0     |
| Com_drop_role                       | 0     |
| Com_drop_server                     | 0     |
| Com_drop_spatial_reference_system   | 0     |
| Com_drop_table                      | 0     |
| Com_drop_trigger                    | 0     |
| Com_drop_user                       | 0     |
| Com_drop_view                       | 0     |
| Com_empty_query                     | 0     |
| Com_execute_sql                     | 0     |
| Com_explain_other                   | 0     |
| Com_flush                           | 0     |
| Com_get_diagnostics                 | 0     |
| Com_grant                           | 0     |
| Com_grant_roles                     | 0     |
| Com_ha_close                        | 0     |
| Com_ha_open                         | 0     |
| Com_ha_read                         | 0     |
| Com_help                            | 0     |
| Com_import                          | 0     |
| Com_insert                          | 0     |
| Com_insert_select                   | 0     |
| Com_install_component               | 0     |
| Com_install_plugin                  | 0     |
| Com_kill                            | 0     |
| Com_load                            | 0     |
| Com_lock_instance                   | 0     |
| Com_lock_tables                     | 0     |
| Com_optimize                        | 0     |
| Com_preload_keys                    | 0     |
| Com_prepare_sql                     | 0     |
| Com_purge                           | 0     |
| Com_purge_before_date               | 0     |
| Com_release_savepoint               | 0     |
| Com_rename_table                    | 0     |
| Com_rename_user                     | 0     |
| Com_repair                          | 0     |
| Com_replace                         | 0     |
| Com_replace_select                  | 0     |
| Com_reset                           | 0     |
| Com_resignal                        | 0     |
| Com_restart                         | 0     |
| Com_revoke                          | 0     |
| Com_revoke_all                      | 0     |
| Com_revoke_roles                    | 0     |
| Com_rollback                        | 0     |
| Com_rollback_to_savepoint           | 0     |
| Com_savepoint                       | 0     |
| Com_select                          | 8     |
| Com_set_option                      | 1     |
| Com_set_password                    | 0     |
| Com_set_resource_group              | 0     |
| Com_set_role                        | 0     |
| Com_signal                          | 0     |
| Com_show_binlog_events              | 0     |
| Com_show_binlogs                    | 0     |
| Com_show_charsets                   | 0     |
| Com_show_collations                 | 0     |
| Com_show_create_db                  | 0     |
| Com_show_create_event               | 0     |
| Com_show_create_func                | 0     |
| Com_show_create_proc                | 0     |
| Com_show_create_table               | 0     |
| Com_show_create_trigger             | 0     |
| Com_show_databases                  | 2     |
| Com_show_engine_logs                | 0     |
| Com_show_engine_mutex               | 0     |
| Com_show_engine_status              | 0     |
| Com_show_events                     | 0     |
| Com_show_errors                     | 0     |
| Com_show_fields                     | 1     |
| Com_show_function_code              | 0     |
| Com_show_function_status            | 0     |
| Com_show_grants                     | 0     |
| Com_show_keys                       | 0     |
| Com_show_master_status              | 0     |
| Com_show_open_tables                | 0     |
| Com_show_plugins                    | 0     |
| Com_show_privileges                 | 0     |
| Com_show_procedure_code             | 0     |
| Com_show_procedure_status           | 0     |
| Com_show_processlist                | 0     |
| Com_show_profile                    | 5     |
| Com_show_profiles                   | 1     |
| Com_show_relaylog_events            | 0     |
| Com_show_replicas                   | 0     |
| Com_show_slave_hosts                | 0     |
| Com_show_replica_status             | 0     |
| Com_show_slave_status               | 0     |
| Com_show_status                     | 2     |
| Com_show_storage_engines            | 0     |
| Com_show_table_status               | 0     |
| Com_show_tables                     | 2     |
| Com_show_triggers                   | 0     |
| Com_show_variables                  | 3     |
| Com_show_warnings                   | 0     |
| Com_show_create_user                | 0     |
| Com_shutdown                        | 0     |
| Com_replica_start                   | 0     |
| Com_slave_start                     | 0     |
| Com_replica_stop                    | 0     |
| Com_slave_stop                      | 0     |
| Com_group_replication_start         | 0     |
| Com_group_replication_stop          | 0     |
| Com_stmt_execute                    | 0     |
| Com_stmt_close                      | 0     |
| Com_stmt_fetch                      | 0     |
| Com_stmt_prepare                    | 0     |
| Com_stmt_reset                      | 0     |
| Com_stmt_send_long_data             | 0     |
| Com_truncate                        | 0     |
| Com_uninstall_component             | 0     |
| Com_uninstall_plugin                | 0     |
| Com_unlock_instance                 | 0     |
| Com_unlock_tables                   | 0     |
| Com_update                          | 0     |
| Com_update_multi                    | 0     |
| Com_xa_commit                       | 0     |
| Com_xa_end                          | 0     |
| Com_xa_prepare                      | 0     |
| Com_xa_recover                      | 0     |
| Com_xa_rollback                     | 0     |
| Com_xa_start                        | 0     |
| Com_stmt_reprepare                  | 0     |
| Compression                         | OFF   |
| Compression_algorithm               |       |
| Compression_level                   | 0     |
+-------------------------------------+-------+# 重點查看4個參數的值,Com_insert,Com_delete,Com_update,Com_select的參數。因為我沒有執行增刪改操作,所以都是0,剛剛又查詢了幾次記錄,這邊的Com_select已經到8了,代表當前已經執行過8次select操作,0次insert,0次delete,0次update。

在需要分析增刪改查操作到底是增刪改比較多還是查詢比較多的時候可以使用這個方式查詢相關記錄的執行情況,分析某個業務到底是查詢比較多呢還是更新比較多,從而可以更好地對系統架構進行把控。


explain

# 對需要執行的sql分析執行計劃,假如要分析下面這條查詢語句
select * from tb_user where id=1;# 語法如下
explain select * from test where id=1;
# 其實就是在查詢語句前加上explain關鍵字,insert,update和delete語句前也可以加上進行分析執行計劃
# 得到結果格式如下+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table   | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | tb_user | NULL       | const | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | NULL  |
+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
# 需要關注id列
# 相同的 id 表示同一查詢塊。
# id 越大,執行優先級越高。
# id 為 NULL 表示是 UNION 結果的合并操作。
# -----------------------------------------------------
# 需要關注type列,其中type列的介紹和性能如下(性能從高到低排列)
# NULL:直接查詢,不進行表操作,例如select 1 + 1;
# system:表中只有一行數據(系統表)。
# const:通過主鍵或唯一索引查找一行數據。
# eq_ref:通過唯一索引關聯表(多表 JOIN 時,每行只匹配一行)。
# ref:通過非唯一索引查找數據。
# range:使用索引范圍掃描。
# index:全索引掃描(掃描索引樹,不訪問數據行)。
# ALL:全表掃描(性能最差)。
# -----------------------------------------------------
# 需要關注possible_keys列和key列
# possible_keys代表可能用到的索引,key就是實際用到的索引,從這里可以分析索引是不是沒有用到或者失效了
# 優化的時候要盡量讓沒有使用到索引的語句使用索引
# -----------------------------------------------------
# 需要關注key_len
# 如果用到了單列索引,則key_len是一個固定值
# 如果用到了聯合索引,key_len的值可能會因為部分索引失效而導致key_len的值不一樣,可以通過這一列判斷聯合索引是否全部生效。
# -----------------------------------------------------
# 需要關注rows列,記錄的是MySQL預估需要掃描的行數。
# 行數越少,性能越好,如果值很大,可能需要優化索引或查詢條件。
# -----------------------------------------------------
# 需要關注filtered列
# filtered= Server層過濾后的行數/存儲引擎層返回的行數 ×100%
# 值越小,說明存儲引擎層已經過濾了更多不滿足條件的數據,Server 層只需處理少量數據。
# -----------------------------------------------------
# 重點關注Extra列,其中可能出現的值如下:
# Using where:使用了 WHERE 條件過濾數據。
# Using index:使用了覆蓋索引(無需回表)。
# Using temporary:使用了臨時表(性能較差)。
# Using filesort:使用了文件排序(性能較差)。
# Using join buffer:使用了 JOIN 緩沖區(多表 JOIN 時)。
# Impossible WHERE:WHERE 條件永遠為假(無結果)。
# 需要注意盡可能避免Using temporary和Using filesort,以及Impossible WHERE。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73219.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73219.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73219.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大模型在支氣管哮喘手術全流程風險預測與治療方案制定中的應用研究

目錄 一、引言 1.1 研究背景與意義 1.2 研究目標與方法 1.3 研究創新點 二、支氣管哮喘概述 2.1 定義與發病機制 2.2 分類與臨床表現 2.3 診斷標準與方法 三、大模型技術原理與應用現狀 3.1 大模型的基本原理 3.2 在醫療領域的應用案例分析 3.3 適用于支氣管哮喘預…

《AI Agent智能應用從0到1定制開發》學習筆記:使用RAG技術增強大模型能力,實現與各種文檔的對話

思維導圖 📚 引言 大型語言模型(如ChatGPT)雖然功能強大,但它們存在一些明顯的局限性。這些模型的知識庫更新較慢,無法實時學習最新內容,而且對私有數據或特定領域的專業知識了解有限。例如,Ch…

Python 爬蟲(4)HTTP協議

文章目錄 一、HTTP協議1、HTTP特點2、HTTP工作原理3、HTTP與HTTPS的區別 前言: HTTP(HyperText Transfer Protocol,超文本傳輸協議)是互聯網上應用最為廣泛的一種網絡協議,用于在客戶端和服務器之間傳輸超文本&#xf…

測試工程 常用Python庫

以下是測試工程師在Python中必須掌握的常用庫、框架以及提升日常工作效率的技巧總結: 一、必須掌握的Python庫與框架 1. 測試框架 unittest Python內置的單元測試框架,提供測試用例、測試套件、斷言等功能,適合單元測試和集成測試。核心組件…

【線程安全問題的原因和方法】【java形式】【圖片詳解】

在本章節中采用實例圖片的方式,以一個學習者的姿態進行描述問題解決問題,更加清晰明了,以及過程中會發問的問題都會一一進行呈現 目錄 線程安全演示線程不安全情況圖片解釋: 將上述代碼進行修改【從并行轉化成穿行的方式】不會出…

Infinite you:flexible photo recrafting while preserving your identity

基于DiT的id保留圖像生成面臨著多種挑戰,缺乏定制模塊設計,模型擴展的困難以及高質量數據的匱乏,因此基于flux的解決方案是相對稀缺的,pulid-flux是基于flux的id保留的初步嘗試,包括instantx和xlabs-ai的flux.1-dev ip-adapters,現有方法在三個關鍵方面保險不足:1.身份相…

Unity 實現一個簡易可拓展性的對話系統

本人能力有限,一切實現僅供參考,如有不足還請斧正 起因是我看到學校社團內有人做了對話系統的分享,我想了想之前沒寫過這種東西,而Fungus插件教程太老了,NodeCanvas插件學習成本又比較高,我就干脆尋找資料 加上自己迭代一下,花了一天時間完成了這個對話系統 目錄 1.介紹 2.核…

linux常用指令(6)

今天我們繼續學習一些linux常用指令,豐富我們linux基礎知識,那么話不多說,來看. 1.cp指令 功能描述:拷貝文件到指定目錄 基本語法:cp [選項] source dest 常用選項:-r:遞歸復制整個文件夾 拷貝文件: 拷貝文件夾&am…

Vue 3 中的路由傳參詳解※※※※

前言 在Vue應用中,路由傳參是非常常見的需求,它允許我們在不同的組件之間傳遞數據。Vue Router提供了兩種主要的方式來傳遞參數:query參數和params參數。下面我們將詳細探討這兩種傳參方式的使用方法和注意事項。 一、query參數 Query參數…

如何創建一個socket服務器?

1. 導入必要的庫 首先,需要導入Python的socket庫,它提供了創建和管理socket連接的功能。 python import socket 2. 創建服務器端socket 使用socket.socket()函數創建一個服務器端的socket對象,指定協議族(如socket.AF_INET表示…

lua垃圾回收

lua垃圾回收 lua 垃圾回收 lua 垃圾回收 collectgarbage(“count”)獲取當前lua腳本占用內存字節數(單位為KB)。 collectgarbage(“collect”)執行一次垃圾回收。 xxxnil 將變量置為空,會釋放內存。 lua中的機制和c#中回收機制很類似 解除羈絆(置為空)。 --垃圾回…

友思特應用 | 行業首創:基于深度學習視覺平臺的AI驅動輪胎檢測自動化

導讀 全球領先的輪胎制造商 NEXEN TIRE 在其輪胎生產檢測過程中使用了基于友思特伙伴Neurocle開發的AI深度學習視覺平臺,實現缺陷檢測率高達99.96%,是該行業首個使用AI平臺技術推動缺陷檢測自動化流程的企業。 將AI應用從輪胎開發擴展到制造過程 2024年…

前后端+數據庫的項目實戰:hbu迎新網-較復雜(下)javaweb

目錄 十一、實現對內容的富文本編輯(換行、圖片顏色等等樣式) (1)下載富文本編輯器,引入資源 (2)將原項目的內容部分替換為富文本編輯器 1、替換添加頁面 2、替換修改頁面(和添…

腳本語言 Lua

概念 Lua由標準C編寫而成,幾乎在所有操作系統和平臺上都可以編譯、運行。Lua腳本可以很容易地被C/C 代碼調用,也可以反過來調用C/C的函數,這使得Lua在應用程序中可以被廣泛應用。Lua并沒有提供強大的庫,它是不適合作為開發獨立應…

【數據分享】2000—2024年我國鄉鎮的逐月歸一化植被指數(NDVI)數據(Shp/Excel格式)

之前我們分享過2000—2024年我國省市縣三級逐月歸一化植被指數(NDVI)數據,該數據是基于NASA定期發布的MOD13A3數據集中的月度NDVI柵格數據(可查看之前的文章獲悉詳情)計算得出。很多小伙伴拿到數據后反饋是否可以處理出…

【負載均衡系列】HAProxy

HAProxy(High Availability Proxy)是一款高性能的 ?TCP/HTTP 負載均衡器,專注于提供高可用性、靈活性和可靠性。以下是關于HAProxy的詳細解析,涵蓋其工作原理、工作機制、工作模式等核心方面: 一、HAProxy 工作原理 HAProxy的核心職責是將客戶端請求高效、可靠地分發到后…

輕松遷移 Elasticsearch 數據:如何將自建索引導出并導入到另一個實例

概述 在日常的 Elasticsearch 運維和數據管理中,數據遷移是一個常見的需求。無論是為了備份、升級,還是將數據從一個集群遷移到另一個集群,導出和導入索引數據都是至關重要的操作。本文將詳細介紹如何將自建 Elasticsearch 實例中的索引數據…

JVM 類加載器之間的層次關系,以及類加載的委托機制

JVM 類加載器之間存在一種層次關系,通常被稱為雙親委派模型 (Parent Delegation Model)。這種層次關系和委托機制是 Java 類加載機制的核心,對于保證 Java 程序的安全性和避免類沖突至關重要。 1. 類加載器的層次關系: JVM 中的類加載器(Cl…

基于 Vue 3 的PDF和Excel導出

以下是基于 Vue 3 Composition API 的完整實現&#xff0c;包括 PDF 和 Excel 導出。 一、PDF 導出 (Vue 3) 安裝依賴 在項目中安裝相關庫&#xff1a; npm install html2canvas jspdf Vue 3 代碼實現 <template><div><div ref"pdfContent" cla…

【Jupyter】notebook無法顯示tqdm進度條

錯誤描述 from tqdm.notebook import tqdm 用的時候報錯&#xff1a; Error displaying widget解決方式 # 先裝nodejs conda install -c conda-forge nodejs20# 重裝ipywidgets pip uninstall ipywidgets pip install ipywidgets jupyter labextension install jupyter-wid…