程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Mysql優化(3)

編輯:關於MYSQL數據庫

一、my.cnf文件選擇

    基於rpm包安裝的mysql,配制文件應該在/usr/local/mysql/share/MySQL目錄中,配制文件有幾個,my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,可根據實際情況和系統內存大小選擇對應的配置。

二、針對不同的存儲引擎采用修改相應的配置參數

    目前,公司采用的存儲引擎為MyISAM,有3個配置參數是最重要的,分別是:key_buffer_size,

query_cache_size,table_cache。

三、優化策略

    1、慢查詢(show variables like '%slow%';查看是否開啟日志,show global status like '%slow%';查看系統中有多少超過默認值2秒的查詢)。

    2、連接數(show variables like 'max_connections';查看系統設計的最大連接數;show global status like 'Max_used_connections';查看當前最大連接),比較理想的狀態計算公式如下:Max_used_connections / max_connections * 100% ≈ 85% 。

    3、Key_buffer_size(how variables like 'key_buffer_size'):key_buffer_size是對MyISAM表性能影響最大的一個參數,指定索引緩沖區的大小,它決定索引處理的速度,尤其是索引讀的速度。通過檢查狀態值Key_read_requests和Key_reads,可以知道key_buffer_size設置是否合理。比例key_reads / key_read_requests應該盡可能的低,至少是1:100,1:1000更好(上述狀態值可以使用SHOW STATUS LIKE ‘key_read%’查詢)。

    4、臨時表(show global status like 'created_tmp%';):每次創建臨時表,Created_tmp_tables增加,如果是在磁盤上創建臨時表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服務創建的臨時文件文件數,比較理想的配置是:Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%比如上面的服務器Created_tmp_disk_tables / Created_tmp_tables * 100% = 1.20%。

    5、Open Table情況(show global status like 'open%tables%';):每當MySQL訪問一個表時,如果在表緩沖區中還有空間,該表就被打開並放入其中,這樣可以更快地訪問表內容。通過檢查峰值時間的狀態值Open_tables和Opened_tables,可以決定是否需要增加table_cache的值。如果你發現open_tables等於table_cache,並且opened_tables在不斷增長,那麼你就需要增加table_cache的值了(上述狀態值可以使用SHOW STATUS LIKE ‘Open%tables’查詢)。注意,不能盲目地把table_cache設置成很大的值。如果設置得太高,可能會造成文件描述符不足,從而造成性能不穩定或者連接失敗。

    6、進程使用情況(show global status like 'Thread%';):如果my.cnf配置文件中設置了thread_cache_size,當客戶端斷開之後,服務器處理此客戶的線程將會緩存起來以響應下一個客戶而不是銷毀(前提是緩存數未達上限)。Threads_created表示創建過的線程數,如果發現Threads_created值過大的話,表明 MySQL服務器一直在創建線程,這也是比較耗資源,可以適當增加配置文件中thread_cache_size值,查詢服務器 thread_cache_size配置:

show variables like 'thread_cache_size';

    7、查詢緩存(show status like 'Qcache%';):查看相關配置是否合理,如Qcache_lowmem_prunes的值非常大,則表明經常出現緩沖不夠的情況,同時Qcache_hits的值非常大,則表明查詢緩沖使用非常頻繁,此時需要增加緩沖大小;Qcache_hits的值不大,則表明你的查詢重復率很低,這種情況下使用查詢緩沖反而會影響效率;Qcache_free_blocks,如果該值非常大,則表明緩沖區中碎片很多。Qcache_free_blocks:緩存中相鄰內存塊的個數。數目大說明可能有碎片。FLUSH QUERY CACHE會對緩存中的碎片進行整理,從而得到一個空閒塊。

    8、排序使用情況(how global status like 'sort%';):Sort_merge_passes 包括兩步。

MySQL 首先會嘗試在內存中做排序,使用的內存大小由系統變量 Sort_buffer_size 決定,如果它的大小不夠把所有的記錄都讀到內存中,MySQL 就會把每次在內存中排序的結果存到臨時文件中,等 MySQL 找到所有記錄之後,再把臨時文件中的記錄做一次排序。這再次排序就會增加 Sort_merge_passes。實際上,MySQL 會用另一個臨時文件來存再次排序的結果,所以通常會看到 Sort_merge_passes 增加的數值是建臨時文件數的兩倍。因為用到了臨時文件,所以速度可能會比較慢,增加 Sort_buffer_size 會減少 Sort_merge_passes 和 創建臨時文件的次數。

    9、文件打開數(show global status like 'open_files';):比較合適的設置:Open_files / open_files_limit * 100% <= 75%;

查看open_file_limit,show variables like 'open_files_limit';

    10、表鎖情況(show global status like 'table_locks%';):Table_locks_immediate表示立即釋放表鎖數,Table_locks_waited表示需要等待的表鎖數,如果 Table_locks_immediate / Table_locks_waited > 5000,最好采用InnoDB引擎,因為InnoDB是行鎖而MyISAM是表鎖,對於高並發寫入的應用InnoDB效果會好些。

    11、表掃描情況(show global status like 'handler_read%';):

表掃描率 = Handler_read_rnd_next / Com_select(show global status like 'com_select';)

  如果表掃描率超過4000,說明進行了太多表掃描,很有可能索引沒有建好,增加read_buffer_size值會有一些好處,但最好不要超過8MB。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved