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裡執行...