最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql開啟慢SQL并分析原因

 更新時間:2019年04月04日 10:55:19   作者:seelye  
今天小編就為大家分享一篇關(guān)于Mysql開啟慢SQL并分析原因,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

第一步.開啟mysql慢查詢

方式一:修改配置文件

Windows:Windows 的配置文件為 my.ini,一般在 MySQL 的安裝目錄下或者 c:\Windows 下。

Linux:Linux 的配置文件為 my.cnf ,一般在 /etc 下

在 my.ini 增加幾行:

[mysqlld] 
long_query_time=2 
#5.0、5.1等版本配置如下選項 
log-slow-queries="mysql_slow_query.log" 
#5.5及以上版本配置如下選項 
slow-query-log=On 
slow_query_log_file="mysql_slow_query.log" 
log-query-not-using-indexes 

第一句使用來定義查過多少秒的查詢算是慢查詢,我這里定義的是2秒

第二句使用來定義慢查詢?nèi)罩镜穆窂剑ㄒ驗槭莣indows,所以不牽涉權(quán)限問題)

第三句就是記錄下沒有使用索引的query

第二步:查看關(guān)于慢查詢的狀態(tài)

方式二:通過MySQL數(shù)據(jù)庫開啟慢查詢

上文的配置需要重啟mysql server進程mysqld才會生效。但是很多時候,尤其是產(chǎn)品運營環(huán)境,不希望每次修改都需要重新啟動mysql服務(wù)器,也希望能在某些特定時間記 錄。MySQL5.1給我們提供了更為靈活的運行時控制,使得你不必重新啟動mysql服務(wù)器,也能選擇性地記錄或者不記錄某些slow queries。

MySQL5.1中,提供了全局變量slow_query_logslow_query_log_file可以靈活地控制enable/disable慢查詢。同時可以通過long_query_time設(shè)置時間

#//啟用slow query記錄
#注意:設(shè)置了slow_query_log全局變量, log_slow_queries也會隱性地跟著改變
mysql>set global slow_query_log=ON

不幸運的是,在MySQL5.0并沒有提供類似的全局變量來靈活控制,但是我們可以通過將long_query_time設(shè)置得足夠大來避免記錄某些查詢語句。比如

mysql>set global long_query_time = 3600;

mysql>set global log_querise_not_using_indexes = ON;

MySQL5.0, 不關(guān)服務(wù)的情況下,希望不記錄日志的辦法是將日志文件成為/dev/null的符號鏈接(symbolic link)。注意:你只需要在改變后運行FLUSH LOGS以確定MYSQL釋放當前的日志文件描述符,重新把日志記錄到/dev/null

和MySQL5.0不同,MySQL5.1可以在運行時改變?nèi)沼浶袨椋瑢⑷罩居涗浀綌?shù)據(jù)庫表中。只要將mysql全局變量log_output設(shè)置為 TABLE即可。MySQL會將日志分別記錄到表mysql.gengera_log和mysql.slow_log二張表中。但是,我們推薦將日志記錄 在日記文件中。

mysql> show variables like ‘log_output'\G
Variable_name: log_output
Value: FILE
mysql>set global log_output='table';

缺陷與審記

雖然記錄了slow query能夠幫助你優(yōu)化產(chǎn)品。但是MySQL目前版本,還有幾大蹩足的地方。

  • 1.MySQL5.0版本, long_query_time時間粒度不夠細,最小值為1秒。對于高并發(fā)性能的網(wǎng)頁腳本而言,1秒出現(xiàn)的意義不大。即出現(xiàn)1秒的查詢比較少。直到mysql5.1.21才提供更細粒度的long_query_time設(shè)定.
  • 2.不能將服務(wù)器執(zhí)行的所有查詢記錄到慢速日志中。雖然MySQL普通日志記錄了所有查詢,但是它們是解析查詢之前就記錄下來了。這意味著普通日志沒辦法包含諸如執(zhí)行時間,鎖表時間,檢查行數(shù)等信息。
  • 3.如果開啟了log_queries_not_using_indexes選項,slow query日志會充滿過多的垃圾日志記錄,這些快且高效的全表掃描查詢(表小)會沖掉真正有用的slow queries記錄。比如select * from category這樣的查詢也會被記錄下來。

通過microslow-patch補丁可使用更細的時間粒度,和記錄所有執(zhí)行過的sql語句。不過,使用這個補訂不得不自己編譯MySQL,出于穩(wěn)定性考濾,我們推薦在開發(fā)測試環(huán)境,可以打上這個補丁,享受這個補丁帶來的便利。在運營環(huán)境盡量不要這么做…

第二步.驗證慢查詢是否開啟

執(zhí)行如下SQL語句來查看mysql慢查詢的狀態(tài)

執(zhí)行結(jié)果會把是否開啟慢查詢、慢查詢的秒數(shù)、慢查詢?nèi)罩镜刃畔⒋蛴≡谄聊簧稀?/p>

/*查看慢查詢時間 */ 
show variables like "long_query_time";默認10s 
/*查看慢查詢配置情況 */ 
show status like "%slow_queries%"; 
/*查看慢查詢?nèi)罩韭窂?*/ 
 show variables like "%slow%"; 

第三步:執(zhí)行一次慢查詢操作

其實想要執(zhí)行一次有實際意義的慢查詢比較困難,因為在自己測試的時候,就算查詢有20萬條數(shù)據(jù)的海量表,也只需要0.幾秒。我們可以通過如下語句代替:

SELECT SLEEP(10);

第四步:查看慢查詢的數(shù)量

通過如下sql語句,來查看一共執(zhí)行過幾次慢查詢:

show global status like '%slow%';

mysql日志的配置:

注意:這些日文件在mysql重啟的時候才會生成 
#記錄所有sql語句 
log=E:/mysqllog/mysql.log 
#記錄數(shù)據(jù)庫啟動關(guān)閉信息,以及運行過程中產(chǎn)生的錯誤信息 
log-error=E:/mysqllog/myerror.log 
# 記錄除select語句之外的所有sql語句到日志中,可以用來恢復(fù)數(shù)據(jù)文件 
log-bin=E:/mysqllog/bin 
#記錄查詢慢的sql語句 
log-slow-queries=E:/mysqllog/slow.log  
#慢查詢時間 
long_query_time=2 

第四步:分析慢查詢?nèi)罩?/strong>

方式一:通過工具分析

MySQL自帶了mysqldumpslow工具用來分析slow query日志,除此之外,還有一些好用的開源工具。比如MyProfi(下載地址:http://sourceforge.net/projects/myprofi/)、mysql-log-filter,當然還有mysqlsla

以下是mysqldumpslow常用參數(shù)說明,詳細的可應(yīng)用mysqldumpslow -help查詢。

  • -s,是表示按照何種方式排序,c、t、l、r分別是按照記錄次數(shù)、時間、查詢時間、返回的記錄數(shù)來排序(從大到小),ac、at、al、ar表示相應(yīng)的倒敘。
  • -t,是top n的意思,即為返回前面多少條數(shù)據(jù)。
  • -g,后邊可以寫一個正則匹配模式,大小寫不敏感。

接下來就是用mysql自帶的慢查詢工具mysqldumpslow分析了(mysql的bin目錄下),我這里的日志文件名字是host-slow.log。

列出記錄次數(shù)最多的10個sql語句

mysqldumpslow -s c -t 10 host-slow.log

列出返回記錄集最多的10個sql語句

mysqldumpslow -s r -t 10 host-slow.log

按照時間返回前10條里面含有左連接的sql語句

mysqldumpslow -s t -t 10 -g "left join" host-slow.log

使用mysqldumpslow命令可以非常明確的得到各種我們需要的查詢語句,對MySQL查詢語句的監(jiān)控、分析、優(yōu)化起到非常大的幫助。

方式二:直接分析mysql慢查詢?nèi)罩?/strong>

日志部分內(nèi)容如下:

# Time: 121017 17:38:54 
# User@Host: root[root] @ localhost [127.0.0.1] 
# Query_time: 3.794217 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 4194304 
SET timestamp=1350466734; 
select * from wei where text='orange'; 
# Time: 121017 17:46:22 
# User@Host: root[root] @ localhost [127.0.0.1] 
# Query_time: 3.819219 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 4194304 
SET timestamp=1350467182; 
select * from wei where text='xishizhaohua'; 

其實定位到了慢查詢語句就已經(jīng)完成了一大不了,執(zhí)行explain或者desc命令查看慢查詢語句,如下圖:

問題很明顯,解決方式也很明顯,建索引了。

mysql> create index text_index on wei(text);  
Query OK, 4194304 rows affected (1 min 58.07 sec)  
Records: 4194304 Duplicates: 0 Warnings: 0 

然后在執(zhí)行查詢操作,用時明顯少了很多。

mysql> select * from wei where text='orange'; 
+---------+--------+ 
| id   | text  | 
+---------+--------+ 
| 4103519 | orange | 
+---------+--------+ 
1 row in set (0.33 sec) 

Slow Query日志,雖然幫助你記錄了那些執(zhí)行過了的SQL語句。但它不是萬能的,意義可能沒有你想象的那么大。它只告訴了你哪些語句慢,但是為什么慢?具體 原因,還是需要你自己去分析,不斷的調(diào)試。也許,你只需要換一條更有效的sql語句,也許你只需簡單地增加一個索引,但也有可能你需要調(diào)整你應(yīng)用程序的設(shè) 計方案。比如,上面那條語句是很明顯,它檢查了600多萬行數(shù)據(jù)。不幸的是,并不是每條語句都這么明顯。也許還有別的原因,比如:

  • *鎖表了,導(dǎo)致查詢處于等態(tài)狀態(tài)。lock_time顯示了查詢等待鎖被翻譯的時間
  • *數(shù)據(jù)或索引沒有被緩存。常見于第一次啟動服務(wù)器或者服務(wù)器沒有調(diào)優(yōu)
  • *備份數(shù)據(jù)庫,I/O變慢
  • *也許同時運行了其它的查詢,減少了當前查詢

所以,不要過于緊張日志文件某條記錄,而應(yīng)該理性地審記,找出真正的原因。如果經(jīng)常出現(xiàn)的slow query需要特別注意。如果個別出現(xiàn),則做一些常規(guī)檢查即可。我們建議,統(tǒng)計并且形成基準報告,進行比較排除,比胡亂瞎撞有用。希望大家不要在這部分過于浪費時間與精力。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • MySQL表的內(nèi)外連接使用詳解

    MySQL表的內(nèi)外連接使用詳解

    內(nèi)連接和左外連接是SQL中常用的連接類型,內(nèi)連接返回兩個表中滿足連接條件的行,而左外連接則返回左表中的所有行以及右表中滿足連接條件的行,如果右表中沒有匹配的行,則返回NULL,本文介紹MySQL表的內(nèi)外連接,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • MySQL分區(qū)之HASH分區(qū)詳解

    MySQL分區(qū)之HASH分區(qū)詳解

    hash分區(qū)的目的是將數(shù)據(jù)按照某列進行hash計算后更加均勻的分散到各個分區(qū),下面這篇文章主要給大家介紹了關(guān)于MySQL分區(qū)之HASH分區(qū)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • MySQL實現(xiàn)顯示百分比顯示和前百分之幾的方法

    MySQL實現(xiàn)顯示百分比顯示和前百分之幾的方法

    這篇文章主要介紹了MySQL中如何顯示百分比和顯示前百分之幾的,文中的示例代碼講解詳細,對我們學(xué)習(xí)MySQL有一定的幫助,感興趣的小伙伴可以了解一下
    2021-12-12
  • MySQL分區(qū)表管理命令匯總

    MySQL分區(qū)表管理命令匯總

    這篇文章主要分享了MySQL分區(qū)表管理命令匯總,分區(qū)是一種表的設(shè)計模式,正確的分區(qū)可以極大地提升數(shù)據(jù)庫的查詢效率,完成更高質(zhì)量的SQL編程。但是如果錯誤地使用分區(qū),那么分區(qū)可能帶來毀滅性的的結(jié)果,下面我們就來看看分區(qū)表那些常用的管理命令,需要的朋友可以參考下
    2022-03-03
  • MYSQL METADATA LOCK(MDL LOCK) 理論及加鎖類型測試

    MYSQL METADATA LOCK(MDL LOCK) 理論及加鎖類型測試

    這篇文章主要介紹了MYSQL METADATA LOCK(MDL LOCK)的內(nèi)容,有理論知識和加鎖類型測試的以下代碼,感興趣的朋友請參考下午文
    2021-09-09
  • MySQL詳解進行JDBC編程與增刪改查方法

    MySQL詳解進行JDBC編程與增刪改查方法

    JDBC是指Java數(shù)據(jù)庫連接,是一種標準Java應(yīng)用編程接口( JAVA API),用來連接 Java 編程語言和廣泛的數(shù)據(jù)庫。從根本上來說,JDBC 是一種規(guī)范,它提供了一套完整的接口,允許便攜式訪問到底層數(shù)據(jù)庫
    2022-06-06
  • Mysql根據(jù)時間查詢?nèi)掌诘膬?yōu)化技巧

    Mysql根據(jù)時間查詢?nèi)掌诘膬?yōu)化技巧

    這篇文章主要介紹了Mysql根據(jù)時間查詢?nèi)掌诘膬?yōu)化技巧,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-03-03
  • MySQL不停地自動重啟的解決方法

    MySQL不停地自動重啟的解決方法

    這篇文章主要給大家介紹了關(guān)于MySQL不停地自動重啟的解決方法,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • mysql中的limit用法有哪些(推薦)

    mysql中的limit用法有哪些(推薦)

    在我們使用查詢語句的時候,經(jīng)常要返回前幾條或者中間某幾行數(shù)據(jù),這個時候怎么辦呢,mysql已經(jīng)為我們提供了這樣一個功能,盡管語法邏輯很是怪異,這個功能就好比oracle里的rownum,但比mysql提供的這個LIMIT好用、好記和好理解多了,具體內(nèi)容一起通過本文看看吧
    2017-10-10
  • Mysql BinLog存儲機制與數(shù)據(jù)恢復(fù)方式

    Mysql BinLog存儲機制與數(shù)據(jù)恢復(fù)方式

    這篇文章主要介紹了Mysql BinLog存儲機制與數(shù)據(jù)恢復(fù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06

最新評論

保德县| 玛沁县| 双辽市| 庆城县| 东海县| 涡阳县| 方城县| 郸城县| 无锡市| 临夏县| 札达县| 大厂| 新平| 会东县| 广灵县| 鸡西市| 富平县| 丹阳市| 瑞丽市| 桐乡市| 阳江市| 务川| 阳高县| 赤水市| 乐东| 葫芦岛市| 古蔺县| 克拉玛依市| 敖汉旗| 佛山市| 沾化县| 南漳县| 雅江县| 获嘉县| 读书| 乌海市| 泾阳县| 盐津县| 石楼县| 博乐市| 和平县|