国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

如何找出MySQL數據庫中的低效SQL語句

2024-07-24 12:36:57
字體:
來源:轉載
供稿:網友

要找出mysql中低效的sql語句我們可以使用 EXPLAIN分析低效sql,但是在使用 EXPLAIN之前我需要開啟mysql慢查詢日志,這樣才可以使用 EXPLAIN,下面我們一起來看看。

面對業務的迅猛發展,DBA的一項重要工作就是及時發現數據庫中的低效SQL語句,有的可以立刻著手解決(比如缺少合適的索引),有的需要盡快反饋給開發人員進行修改。

MySQL數據庫有幾個配置選項可以幫助我們及時捕獲低效SQL語句:

1,slow_query_log

這個參數設置為ON,可以捕獲執行時間超過一定數值的SQL語句。

2,long_query_time

當SQL語句執行時間超過此數值時,就會被記錄到日志中,建議設置為1或者更短。

3,slow_query_log_file

記錄日志的文件名。

4,log_queries_not_using_indexes

這個參數設置為ON,可以捕獲到所有未使用索引的SQL語句,盡管這個SQL語句有可能執行得挺快.

Windows下開啟MySQL慢查詢

MySQL在Windows系統中的配置文件一般是是my.ini找到[mysqld]下面加上如下代碼:

log-slow-queries = F:/MySQL/log/mysqlslowquery.log

long_query_time = 2

Linux下啟用MySQL慢查詢

MySQL在Windows系統中的配置文件一般是是my.cnf找到[mysqld]下面加上如下代碼:

log-slow-queries=/data/mysqldata/slowquery.log

long_query_time=2

注意:log-slow-queries = F:/MySQL/log/mysqlslowquery.log為慢查詢日志存放的位置,一般這個目錄要有MySQL的運行帳號的可寫權限,一般都將這個目錄設置為MySQL的數據存放目錄.

long_query_time=2中的2表示查詢超過兩秒才記錄;

配置好上述幾個參數后,我們就可以監視日志,然后著手進行解決了,如下通過 EXPLAIN 分析低效 SQL的執行計劃:

通過以上步驟查詢到效率低的SQL后,我們可以通過explain或者desc 獲取MySQL如何執行SELECT語句的信息,包括select語句執行過程表如何連接和連接的次序。

explain可以知道什么時候必須為表加入索引以得到一個使用索引來尋找記錄的更快的SELECT,代碼如下:

  1. mysql> explain select sum(moneys) from sales a,companys b where a.company_id = 
  2. b.id and a.year = 2006; 
  3. +----------------+----------+-----------+----------------+----------------+--------- 
  4. -+-----------+----------------+ 
  5. | select_type| table | type | possible_keys| key| key_len|rows 
  6. | Extra| 
  7. +----------------+----------+-----------+----------------+----------------+--------- 
  8. -+-----------+----------------+ 
  9. | SIMPLE| b| index | PRIMARYPRIMARY| 4|1 | Using index 
  10. | SIMPLE| a| ALLNULLNULLNULL |12 | Using where 
  11. +----------------+----------+-----------+----------------+----------------+--------- 
  12. -+-----------+----------------+ 
  13. rows in set (0.02 sec) 

select_type:select 類型

table:輸出結果集的表

type:表示表的連接類型

當表中僅有一行是type的值為system是最佳的連接類型;

當select操作中使用索引進行表連接時type的值為ref;

當select的表連接沒有使用索引時,經常會看到type的值為ALL,表示對該表進行了全表掃描,這時需要考慮通過創建索引來提高表連接的效率.

possible_keys:表示查詢時,可以使用的索引列.

key:表示使用的索引

key_len:索引長度

rows:掃描范圍

Extra:執行情況的說明和描述

確定問題,并采取相應的優化措施,經過以上步驟,基本可以確認問題出現的原因,可以根據情況采取相應的措施,進行優化提高執行的效率.

例如上面的例子,我們確認是對a表的全表掃描導致效率的不理想,我們對a表的year字段創建了索引,查詢需要掃描的行數明顯較少,代碼如下:

  1. mysql> explain select sum(moneys) from sales a,companys b where a.company_id = 
  2. b.id and a.year = 2006; 
  3. +----------------+----------+-----------+----------------+----------------+--------- 
  4. -+-----------+----------------+ 
  5. | select_type| table | type | possible_keys| key| key_len|rows 
  6. | Extra| 
  7. +----------------+----------+-----------+----------------+----------------+--------- 
  8. -+-----------+----------------+ 
  9. | SIMPLE| b| index | PRIMARYPRIMARY| 4|1 | Using index 
  10. | SIMPLE| a| ref| yearyear| 4|3 |Using 
  11. where|   //Vevb.com 
  12. +----------------+----------+-----------+----------------+----------------+--------- 
  13. -+-----------+----------------+ 
  14. rows in set (0.02 sec)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 梓潼县| 夏河县| 靖安县| 株洲市| 威远县| 乾安县| 墨竹工卡县| 安溪县| 禹州市| 醴陵市| 荣成市| 民权县| 观塘区| 呼图壁县| 隆回县| 梅州市| 武宁县| 沁源县| 台湾省| 吉木乃县| 葫芦岛市| 泾源县| 沙洋县| 罗江县| 资源县| 时尚| 抚顺市| 青田县| 沭阳县| 睢宁县| 凤城市| 庄浪县| 定结县| 汶川县| 石门县| 雅江县| 贵港市| 双流县| 铜川市| 揭阳市| 宣城市|