mysql效能除錯,不斷總結!

2021-06-02 06:28:40 字數 2765 閱讀 1846

mysql在遇到嚴重效能問題時,一般都有這麼幾種可能:

1、索引沒有建好;

2、sql寫法過於複雜;

3、配置錯誤;

4、機器實在負荷不了;

1.索引沒建好,乙個辦法,後台執行指令碼,show processlist 實時檢視mysql的工作情況,記錄,鎖死mysql的語句。然後,desc(explain)語句,檢視用到了什麼索引,然後看情況建立合適的索引。(這個索引比較麻煩,有時候這裡解決了,其他地方又慢了,所以要通盤考慮)

2.檢查查詢效率慢的sql語句,看怎麼優化,也是用desc或者explain來看。

3.配置:

配置裡主要引數是key_buffer,sort_buffer_size,myisam_sort_buffer_size,

key_buffer=128m:全部表的索引都會盡可能放在這塊記憶體區域內,索引比較大的話就開稍大點都可以,我一般設為128m,有個好的建議是把很少用到並且比較大的表想辦法移到別的地方去,這樣可以顯著減少mysql的記憶體占用。

sort_buffer_size=1m:單個執行緒使用的用於排序的記憶體,查詢結果集都會放進這記憶體裡,如果比較小,mysql會多放幾次,所以稍微開大一點就可以了,重要是優化好索引和查詢語句,讓他們不要生成太大的結果集。

另外一些配置:

thread_concurrency=8:這個配置標配=cpu數量x2

interactive_timeout=30

wait_timeout=30:這兩個配置使用10-30秒就可以了,這樣會盡快地釋放記憶體資源,注意:一直在使用的連線是不會斷掉的,這個配置只是斷掉了長時間不動的連線。

query_cache:這個功能不要使用,現在很多人看到cache這幾個字母就像看到了寶貝,這是不唯物主義的。mysql的query_cache 在每次表資料有變化的時候都會重新清理連至該錶的所有快取,如果更新比較頻繁,query_cache不但幫不上忙,而且還會對效率影響很大。這個引數只適合唯讀型的資料庫,如果非要用,也只能用query_cache_type=2自行用sql_cache指定一些sql進行快取。

max_connections:預設為100,一般情況下是足夠用的,但是一般要開大一點,開到400-600就可以了,能超過600的話一般就有效率問題,得另找對策,光靠增加這個數字不是辦法。

其它配置可以按預設就可以了,個人覺得問題還不是那麼的大,提醒一下:1、配置雖然很重要,但是在絕大部分情況下都不是效率問題的罪魁禍首。2、mysql是乙個資料庫,對於資料庫最重要考究的不應是效率,而是穩定性和資料準確性。

注意:這裡wait_timeout,會kill超過這個時間sleep的語句,還需要改:

interactive_timeout!

其他一些:

back_log           指定到來的tcp/ip連線的偵聽佇列大小     因作業系統不同而不同,linux系統推薦小於512的整數,一般設定成300    

key_buffer_size     索引快取大小     優化索引的緩衝區大小     根據*.myi的檔案大小進行設定,沒有myisam表的情況下保留16-32m提供磁碟臨時表索引用      

max_connections     最大連線數     優化mysql的最大連線數     500    

innodb_buffer_pool_size     innodb緩衝池大小     用於快取表的資料與索引     記憶體的80%    

innodb_additional_mem_pool_size     innodb附加記憶體快取池大小     用於存放資料目錄資訊和其他內部資料結構     20m左右    

innodb_log_file_size     每個日誌檔案大小     用於存放日誌     64-512m     5242880  (5m)32位機器小於4g

innodb_log_buffer_size     每個日誌檔案快取大小     優化高強度寫入與短事務處理能力     8-16m   

innodb_flush_log_at_trx_commit     提交事務日誌重新整理方式     0.不重新整理事務提交1.重新整理到磁碟2.重新整理到作業系統快取     2.重新整理到作業系統快取.後果:除非作業系統崩潰或停電會損失1秒的事務提交記錄      

table_cache     表快取     快取已開啟的表     1024   

thread_cache_size     執行緒快取大小     它的目的是在通常的操作中無需建立新執行緒。     至少16 

query_cache_size     查詢快取大小     提高快取命中率     32-512m    

sort_buffer_size     查詢排序快取大小     優化排序快取空間     6m    

read_buffer_size     讀查詢快取大小     優化讀查詢操作快取空間     4m    

join_buffer_size     聯合查詢操作快取大小     優化聯合查詢操作快取空間     8m    

4.mysql負載不了

a:通過mysql同步功能將資料同步到數台從資料庫,由主資料庫寫入,從資料庫提供讀取。

b:最靠譜的,使用memcachedb

c:加入快取(網上看到的,並沒有研究)

加入快取之後,就可以解決併發的問題,效果很明顯。如果是實時系統,可以考慮用重新整理快取方式使快取保持最新。

在前端加入squid的架構比較提倡使用,在命中率比較高的應用中,基本上可以解決問題。

如果是在程式邏輯層裡面進行快取,會增加很多複雜性,問題會比較多而且難解決,不建議在這一層面進行調整。

不斷學習,不斷總結

總結自己 1.歷時近一年的工作時間,不停工作不停學習,在技術上多多少少有些收穫.2.工作上相識相知很多同事,每個人都有每個人的特點,不管關係再好都走不到一起,社會真的很複雜.3.在心態上還算一直放得較正,沒有走向極端,沒有抱怨的生活.樂觀面對點點滴滴.4.生活,單調,現在愛上了單車,每天都有它來陪伴...

不斷學習,不斷總結

總結自己 1.歷時近一年的工作時間,不停工作不停學習,在技術上多多少少有些收穫.2.工作上相識相知很多同事,每個人都有每個人的特點,不管關係再好都走不到一起,社會真的很複雜.3.在心態上還算一直放得較正,沒有走向極端,沒有抱怨的生活.樂觀面對點點滴滴.4.生活,單調,現在愛上了單車,每天都有它來陪伴...

ORACLE 效能除錯 總結中ing

1 分析使用者所有的物件 select exec dbms stats.gather table stats scms t.table name cascade true,estimate percent 2 from user tables t 查詢出來的記錄,在commond window裡執行...