1. 程式人生 > >mysql 通過查看mysql 配置參數、狀態來優化你的mysql

mysql 通過查看mysql 配置參數、狀態來優化你的mysql

lamp 總數 程序 com urg ibdata1 讀取 比例 新的

我把MYISAM改成了INNODB,數據庫對CPU方面的占用變小很多‘

mysql的監控方法大致分為兩類: 1.連接到mysql數據庫內部,使用show status,show variables,flush status 來查看mysql的各種性能指標。 2. 直接使用mysqladmin查看其性能指標,例如: UserParameter=mysql.uptime,mysqladmin -uroot status|cut -f2 -d":"|cut -f1 -d"T" mysqladmin兩個參數,status,extended-status shell > mysqladmin -uroot -ppassword variables status 可得到以下信息(後面詳解) -------------------------------------------------------------------------------------------------------------------------- Uptime: 4557887 #mysql運行的秒數 Threads: 1 #連接數 Questions: 1684130 #The number of questions (queries) from clients since the server was started. Slow queries: 0 #The number of queries that have taken more than long_query_time seconds Opens: 221872 #The number of tables the server has opened. Flush tables: 1 #The number of flush-*, refresh, and reload commands the server has executed. Open tables: 64 #The number of tables that currently are open. Queries per second avg: 0.369 #從上次運行開始計算,每秒鐘平均查詢次數 ----------------------------------------------------------------------------------------------------- Questions = Com_* + Qcache_hits 最完整的信息 shell > mysqladmin -uroot -ppassword variables extended-status 其他的信息 shell > /usr/libexec/mysqld --verbose --help (這個命令生成所有mysqld選項和可配置變量的列表 ) mysql>SHOW STATUS; (服務器狀態變量,運行服務器的統計和狀態指標) mysql> SHOW VARIABLES;(服務器系統變量,實際上使用的變量的值) 或者 mysql>SHOW STATUS LIKE ‘%變量名% ‘ ; 對配置參數的說明: 配置參數的格式如下:(shell > mysqladmin -uroot -ppassword variables extended-status) ----------------------------- +-----------------------------------------+------------------------------------------------------------+ | Variable_name | Value | +-----------------------------------------+------------------------------------------------------------+ | auto_increment_increment | 1 | | auto_increment_offset | 1 | | automatic_sp_privileges | ON | ......... 註:value 值的單位是byte ,要得到M ,需除以2次1024 ----------------------------------- Uptime 4405546 MySQL服務器已經運行的秒數 ----------------------------------- auto_increment_increment 1 auto_increment_offset 1 兩個變量值都只能為1到65,535之間的整數值。設置為非整數值,則會給出錯誤。 這兩個變量影響AUTO_INCREMENT列。 auto_increment_increment控制列中的值的增量值(步進量)。 auto_increment_offset確定AUTO_INCREMENT列值的初始值。 一般不去更改。更改方法:mysql> SET @auto_increment_offset=5; ----------------------------------------------------------------------------------------------------- max_connections 100 table_cache 64 open_files_limit 1024 Open_tables 64 Opened_tables 187690 幾個參數的關系: table_cache * 2 + max_connections=max_open_files max_connections 默認為100 mysql>show processlist; mysql>show full processlist; ----------------------- ------------------------- max_open_files 由 open_files_limit 參數決定。 mysql打開的最大文件數,受兩個參數的影響:系統打開的最大文件數(ulimit -n)和 open_files_limit 。 加大max_open_files的值 ------------------------------------------------------------- 在/etc/my.cnf加入open_files_limit=8192 在/etc/security/limits.conf添加 * soft nofile 8192 * hard nofile 8192 -------------------------------------------------------------------- 最好用sysctl或者修改/etc/sysctl.conf文件,同時還要在配置文件中把open_files_limit這個參數增大,對於4G內存服務器,open_files_limit至少要增大到4096,非特殊情況,設置成8192就可以了。 table_cache MySQL 5.0升級到5.1,table_cache 改名table_open_cache 設置表高速緩存的數目。 表緩存的說明: 當 Mysql 訪問一個表時,如果該表在緩存中已經被打開,則可以直接訪問緩存;如果還沒有被緩存,但是在 Mysql 表緩沖區中還有空間,那麽這個表就被打開並放入表緩沖區;如果表緩存滿了,則會按照一定的規則將當前未用的表釋放,或者臨時擴大表緩存來存放,使用表緩存的好處是可以更快速地訪問表中的內容。 每個連接進來,都會至少打開一個表緩存。因此, table_cache 的大小應與 max_connections 的設置有關。例如,對於 200 個並行運行的連接,應該讓表的緩存至少有 200 × N ,這裏 N 是網站程序一次查詢所用到的表的最大值。 每個線程會獨自持有一個數據文件的文件描述符,而索引文件的文件描述符是公用的。當table cache不夠用的時候,MySQL會采用LRU算法踢掉最長時間沒有使用的表。如果table_cache設置過小,MySQL就會反復打開、關閉 frm文件,造成一定的性能損失。如果table_cache設置過大,MySQL將會消耗很多CPU去做 table cache的算法運算。 而InnoDB的元數據管理是放在共享表空間裏面做的,所以獲取表的結構不需要去反復解析frm文件,這是比MyISAM強的地方。即使 table_cache設置過小,對於InnoDB的影響也是很小的,因為它根本不需要反復打開、關閉frm文件去獲取元數據。 合理設置table_cache的大小:通過查看open_tables,Opened_tables,Flush tables 的值來比較。 察看當前的表緩存情況: shell > mysqladmin -uroot -ppassword variables status ---------------------------------- Opens: 221872 則是已經打開的表的數量。 Flush tables: 1 Open tables: 64 是當前打開的表的數量 ---------------------------------- mysql> show global status like ‘open%_tables‘; ---------------------------------- open_tables 是當前打開的表的數量, Opened_tables 表示打開過的表數量 ---------------------------------- 清空表緩存 mysql> flush tables; 如果發現 open_tables 接近 table_cache 的時候,如果 Opened_tables 隨著重新運行 SHOW STATUS 命令快速增加,就說明緩存命中率不夠。並且多次執行FLUSH TABLES(通過shell > mysqladmin -uroot -ppassword variables status ),那就說明可能 table_cache 設置的偏小,經常需要將緩存的表清出,將新的表放入緩存,這時可以考慮增加這個參數的大小來改善訪問的效率。 如果 Open_tables 比 table_cache 設置小很多,就說明table_cache 設的太大了。 table_cache的值在2G內存以下的機器中的值默認時256到512,如果機器有4G內存,則默認這個值是2048,但這決意味著機器內存越大,這個值應該越大,因為table_cache加大後,使得mysql對SQL響應的速度更快了,不可避免的會產生更多的死鎖(dead lock),這樣反而使得數據庫整個一套操作慢了下來,嚴重影響性能。 註意,不能盲目地把table_cache設置成很大的值。如果設置得太高,可能會造成文件描述符不足,從而造成性能不穩定或者連接失敗。 對於有1G內存的機器,推薦值是128-256。 -------------------------------------------------------------------- key_buffer_size 67108864(/1024/1024=64M) Key_read_requests 40944 從緩存讀鍵的數據塊的請求數。 Key_reads 2711 從硬盤讀取鍵的數據塊的次數。 Key_write_requests 將鍵的數據塊寫入緩存的請求數。 Key_writes 向硬盤寫入將鍵的數據塊的物理寫操作的次數。 (獲得信息: shell > mysqladmin -uroot -ppassword variables extended-status shell>mysqladmin -uroot -ppassword variable status mysql> show status like ‘%key_read%‘; ) key_buffer_size設置索引塊(index blocks)緩存的大小,保存了 MyISAM 表的索引塊。它被所有線程共享,決定了數據庫索引處理的速度,尤其是索引讀的速度。理想情況下,對於這些塊的請求應該來自於內存,而不是來自於磁盤。 只對MyISAM表起作用。即使你不使用MyISAM表,但是內部的臨時磁盤表是MyISAM表,也要使用該值。 key_buffer_size: 如果不使用MyISAM存儲引擎,16MB足以,用來緩存一些系統表信息等。如果使用 MyISAM存儲引擎,在內存允許的情況下,盡可能將所有索引放入內存,簡單來說就是“越大越好” 合理設置key_buffer_size的方法: 查看Key_read_requests和Key_reads的比例, Key_reads 代表命中磁盤的請求個數, Key_read_requests 是總數。命中磁盤的讀請求數除以讀請求總數就是不中比率。如果每 1,000 個請求中命中磁盤的數目超過 1 個,就應該考慮增大關鍵字緩沖區了。 key_reads / key_read_requests的值應該盡可能的低,比如1:100,1:1000 ,1:10000。 對於內存在4GB左右的服務器該參數可設置為256M或384M。 註意:該參數值設置的過大反而會是服務器整體效率降低! -------------------------------------------------------------------------------------------------------- 256MB內存和許多表,想要在中等數量的客戶時獲得最大性能,應使用: shell> mysqld_safe --key_buffer_size=64M --table_cache=256 --sort_buffer_size=4M --read_buffer_size=1M & ------------------------------------------------------------------------------------------------------------------------------------------------------- 每個連接到MySQL服務器的線程都需要有自己的緩沖,默認為其分配256K。事務開始之後,則需要增加更多的空間。運行較小的查詢可能僅給指定的線程增加少量的內存消耗,例如存儲查詢語句的空間等。但如果對數據表做復雜的操作比較復雜,例如排序則需要使用臨時表,此時會分配大約read_buffer_size,sort_buffer_size,read_rnd_buffer_size,tmp_table_size大小的內存空間。不過它們只是在需要的時候才分配,並且在那些操作做完之後就釋放了。 myisam_sort_buffer_size 8388608 當在REPAIR TABLE或用CREATE INDEX創建索引或ALTER TABLE過程中排序 MyISAM索引分配之緩沖區。 sort_buffer_size 2097144 每個排序線程分配的緩沖區的大小。增加該值可以加快ORDER BY或GROUP BY操作。 註意:該參數對應的分配內存是每個連接獨享,如果有100個連接,那麽實際分配的總共排序緩沖區大小為100 × 6 = 600MB。所以,對於內存在4GB左右的服務器推薦設置為6-8M。 mysql> SHOW STATUS LIKE "sort%"; --------------------------- Sort_merge_passes 1 Sort_range 79192 Sort_rows 2066532 Sort_scan 44006 --------------------------- 如果 sort_merge_passes 很大,就表示需要註意 sort_buffer_size。 當 MySQL 必須要進行排序時,就會在從磁盤上讀取數據時分配一個排序緩沖區來存放這些數據行。如果要排序的數據太大,那麽數據就必須保存到磁盤上的臨時文件中,並再次進行排序。如果 sort_merge_passes 狀態變量很大,這就指示了磁盤的活動情況。 read_buffer_size 131072 (show variables like ‘read%‘;) ---------------- read_buffer_size 1048576 read_rnd_buffer_size 524288 --------------- read_buffer_size是MySql讀入緩沖區大小。對表進行順序掃描的請求將分配一個讀入緩沖區,MySql會為它分配一段內存緩沖區。read_buffer_size變量控制這一緩沖區的大小。 每個線程連續掃描時為掃描的每個表分配的緩沖區的大小(字節)。如果進行多次連續掃描,可能需要增加該值, 默認值為131072。和sort_buffer_size一樣,該參數對應的分配內存也是每連接獨享。 read_rnd_buffer_size read_rnd_buffer_size是MySql的隨機讀緩沖區大小。當按任意順序讀取行時(例如,按照排序順序),將分配一個隨機讀緩存區。進行排序查詢時,MySql會首先掃描一遍該緩沖,以避免磁盤搜索,提高查詢速度,如果需要排序大量數據,可適當調高該值。該參數對應的分配內存也是每連接獨享。 join_buffer_size 131072 聯合查詢操作所能使用的緩沖區大小,和sort_buffer_size一樣,該參數對應的分配內存也是每個連接獨享。 -------------------------------------------------------------------------------------------------------- max_allowed_packet 1048576 net_buffer_length 16384 包消息緩沖區初始化為net_buffer_length字節,但需要時可以增長到max_allowed_packet字節。該值默認很小,以捕獲大的(可能是錯誤的)數據包。 -------------------------------------------------------------------------------------------------------- thread_stack 196608 每個線程的堆棧大小。用crash-me測試檢測出的許多限制取決於該值。 默認值足夠大,可以滿足普通操作。 -------------------------------------------------------------------------------------------------------- thread_cache_size 0 query_cache_size 0 tmp_table_size 33554432 innodb_thread_concurrency 8 max_connections 100 max_connect_errors 10 (獲得信息: shell > mysqladmin -uroot -ppassword variables extended-status shell>mysqladmin -uroot -ppassword variable status ) thread_cache_size ( mysql> show status LIKE ‘threads%‘; ) --------------------------- Threads_cached 27 Threads_connected 15 Threads_created 838610 Threads_running 3 ---------------------------- 線程緩存。mysqld 在接收連接時會根據需要生成線程。在一個連接變化很快的繁忙服務器上,對線程進行緩存便於以後使用可以加快最初的連接。 此處重要的值是 Threads_created,每次 mysqld 需要創建一個新線程時,這個值都會增加。如果這個數字在連續執行 SHOW STATUS 命令時快速增加,就應該嘗試增大線程緩存。 query_cache_size mysql> SHOW VARIABLES LIKE ‘have_query_cache‘; mysql> show variables like ‘%query%‘; ------------------------------------ ft_query_expansion_limit 20 have_query_cache YES long_query_time 10.000000 query_alloc_block_size 8192 query_cache_limit 1048576 query_cache_min_res_unit 4096 query_cache_size 0 query_cache_type ON query_cache_wlock_invalidate OFF query_prealloc_size 8192 slow_query_log OFF slow_query_log_file /var/run/mysqld/mysqld-slow.log ------------------------------------- have_query_cache 是否有查詢緩存 query_cache_limit 指定單個查詢能夠使用的緩沖區大小,缺省為1M query_cache_type 變量影響其工作方式。這個變量可以設置為下面的值: 0 或OFF 將阻止緩存或查詢緩存結果。 1 或ON 將允許緩存,以SELECT SQL_NO_CACHE 開始的查詢語句除外。 2 或DEMAND , 僅對以SELECT SQL_CACHE 開始的那些查詢語句啟用緩存。 如果全部使用innodb存儲引擎,建議為0,如果使用MyISAM 存儲引擎,建議為2 query_cache_min_res_unit 是在4.1版本以後引入的,它指定分配緩沖區空間的最小單位,缺省為4K。檢查狀態值Qcache_free_blocks,如果該值非常大,則表明緩沖區中碎片很多,這就表明查詢結果都比較小,此時需要減小 query_cache_min_res_unit。 query_cache_size 為了存儲老的查詢結果而分配的內存數量 (以字節指定) 。如果設置它為 0 ,查詢緩沖將被禁止(缺省值為 0 )。 根據 命中率(Qcache_hits/(Qcache_hits+Qcache_inserts)*100))進行調整,一般不建議太大,256MB可能已經差不多了,大型的配置型靜態數據可適當調大 mysql> SHOW STATUS LIKE ‘qcache%‘; --------------------------------------- Qcache_free_blocks 5216 Qcache_free_memory 14640664 Qcache_hits 2581646882 Qcache_inserts 360210964 Qcache_lowmem_prunes 281680433 Qcache_not_cached 79740667 Qcache_queries_in_cache 16927 Qcache_total_blocks 47042 ----------------------------------------- Qcache_free_blocks 緩存中相鄰內存塊的個數。數目大說明可能有碎片。FLUSH QUERY CACHE 會對緩存中的碎片進行整理,從而得到一個空閑塊。 Qcache_free_memory 緩存中的空閑內存。 Qcache_hits 每次查詢在緩存中命中時就增大。 Qcache_inserts 每次插入一個查詢時就增大。 未命中然後插入。 Qcache_lowmem_prunes 的值非常大,則表明經常出現緩沖不夠的情況,同時Qcache_hits的值非常大,則表明查詢緩沖使用非常頻繁,此時需要增加緩沖大小,Qcache_hits的值不大,則表明你的查詢重復率很低,這種情況下使用查詢緩沖反而會影響效率,那麽可以考慮不用查詢緩沖。這個數字最好長時間來看;如果這個數字在不斷增長,就表示可能碎片非常嚴重,或者內存很少。(上面的 free_blocks 和 free_memory 可以告訴您屬於哪種情況)。 Qcache_not_cached 不適合進行緩存的查詢的數量,通常是由於這些查詢不是 SELECT 語句。 Qcache_queries_in_cache 當前緩存的查詢(和響應)的數量。 Qcache_total_blocks 緩存中塊的數量。 Total number of queries = Qcache_inserts + Qcache_hits + Qcache_not_cached. 查詢命中率=Qcache_hits -Qcache_inserts /Qcache_hits 查詢插入率=Qcache_inserts / Com_select; 未插入率 = Qcache_not_cached / Com_select; 很多 LAMP 應用程序都嚴重依賴於數據庫,但卻會反復執行相同的查詢。每次執行查詢時,數據庫都必須要執行相同的工作 —— 對查詢進行分析,確定如何執行查詢,從磁盤中加載信息,然後將結果返回給客戶機。MySQL 有一個特性稱為查詢緩存,查詢緩存會存儲一個 SELECT 查詢的文本與被傳送到客戶端的相應結果。如果之後接收到一個同樣的查詢,服務器將從查詢緩存中檢索結果,而不是再次分析和執行這個同樣的查詢。在很多情況下,這會極大地提高性能。不過,問題是查詢緩存在默認情況下是禁用的。 通常,間隔幾秒顯示這些變量就可以看出區別,這可以幫助確定緩存是否正在有效地使用。運行 FLUSH STATUS 可以重置一些計數器,如果服務器已經運行了一段時間,這會非常有幫助。 使用非常大的查詢緩存,期望可以緩存所有東西,這種想法非常誘人。但如果表有變動時,首先要把Query_cache和該表相關的語句全部置為失效,然後在寫入更新。 那麽如果Query_cache非常大,該表的查詢結構又比較多,查詢語句失效也慢,一個更新或是Insert就會很慢,這樣看到的就是Update或是Insert怎麽這麽慢了。 所以在數據庫寫入量或是更新量也比較大的系統,該參數不適合分配過大。而且在高並發,寫入量大的系統,建系把該功能禁掉。 作為一條規則,如果 FLUSH QUERY CACHE 占用了很長時間,那就說明緩存太大了。 -------------------------------------------------------------------------------------------------------- wait_timeout 28800 服務器關閉非交互連接之前等待活動的秒數。 在線程啟動時,根據全局wait_timeout值或全局interactive_timeout值初始化會話wait_timeout值,取決於客戶端類型 connect_timeout 10 mysqld服務器用Bad handshake響應前等待連接包的秒數。 interactive_timeout 28800 服務器關閉交互式連接前等待活動的秒數。交互式客戶端定義為在mysql_real_connect()中使用CLIENT_INTERACTIVE選項的客戶端。 -------------------------------------------------------------------------------------------------------- mysql> SHOW STATUS LIKE "com_select"; ------------------------------- Com_select 318243 ------------------------------- mysql> SHOW STATUS LIKE "handler_read_rnd_next"; ------------------------------- Handler_read_rnd_next 165959471 ----------------------------------- MySQL 也會分配一些內存來讀取表。理想情況下,索引提供了足夠多的信息,可以只讀入所需要的行,但是有時候查詢(設計不佳或數據本性使然)需要讀取表中大量數據。要理解這種行為,需要知道運行了多少個 SELECT 語句,以及需要讀取表中的下一行數據的次數(而不是通過索引直接訪問)。 Handler_read_rnd_next / Com_select 得出了表掃描比率 —— 在本例中是 521:1。如果該值超過 4000,就應該查看 read_buffer_size,例如 read_buffer_size = 4M。如果這個數字超過了 8M,就應該與開發人員討論一下對這些查詢進行調優了! -------------------------------------------------------------------------------------------------------- mysql> SHOW STATUS LIKE ‘created_tmp%‘; ------------------------ Created_tmp_disk_tables 30660 Created_tmp_files 2 Created_tmp_tables 32912 --------------------- 臨時表可以在更高級的查詢中使用,其中數據在進一步進行處理(例如 GROUP BY 字句)之前,都必須先保存到臨時表中;理想情況下,在內存中創建臨時表。但是如果臨時表變得太大,就需要寫入磁盤中。 每次使用臨時表都會增大 Created_tmp_tables;基於磁盤的表也會增大 Created_tmp_disk_tables。對於這個比率,並沒有什麽嚴格的規則,因為這依賴於所涉及的查詢。長時間觀察 Created_tmp_disk_tables 會顯示所創建的磁盤表的比率,您可以確定設置的效率。 tmp_table_size 和 max_heap_table_size 都可以控制臨時表的最大大小,因此請確保在 my.cnf 中對這兩個值都進行了設置。 ------------------------------------------------------------------------------------------------------- 日誌相關 log-bin=mysql-bin binlog_format=mixed mysql-bin.000001、mysql-bin.000002等文件是數據庫的操作日誌,例如UPDATE一個表,或者DELETE一些數據,即使該語句沒有匹配的數據,這個命令也會存儲到日誌文件中,還包括每個語句執行的時間,也會記錄進去的。 ================================================================================================= InnoDB innodb_buffer_pool_size   innodb_buffer_pool_size 定義了 InnoDB 存儲引擎的表數據和索引數據的最大內存緩沖區大小。和 MyISAM 存儲引擎不同, MyISAM 的 key_buffer_size 只能緩存索引鍵,而 innodb_buffer_pool_size 卻可以緩存數據塊和索引鍵。適當的增加這個參數的大小,可以有效的減少 InnoDB 類型的表的磁盤 I/O 。為Innodb加速優化首要參數。默認值8M 這個參數不能動態更改,所以分配需多考慮。分配過大,會使Swap占用過多,致使Mysql的查詢特慢。如果你的數據量不大,並且不會暴增,那麽可分配是你的數據大小+10%左右做為這個參數的值。例如:數據大小為50M,那麽給這個值分配innodb_buffer_pool_size=64M mysql>show variables like ‘innodb%‘; --------------------- innodb_adaptive_hash_index ON innodb_additional_mem_pool_size 2097152 innodb_autoextend_increment 8 innodb_autoinc_lock_mode 1 innodb_buffer_pool_size 67108864 innodb_checksums ON innodb_commit_concurrency 0 innodb_concurrency_tickets 500 innodb_data_file_path ibdata1:10M:autoextend innodb_data_home_dir /var/lib/mysql innodb_doublewrite ON innodb_fast_shutdown 1 innodb_file_io_threads 4 innodb_file_per_table OFF innodb_flush_log_at_trx_commit 1 innodb_flush_method innodb_force_recovery 0 innodb_lock_wait_timeout 50 innodb_locks_unsafe_for_binlog OFF innodb_log_buffer_size 8388608 innodb_log_file_size 16777216 innodb_log_files_in_group 2 innodb_log_group_home_dir /var/lib/mysql innodb_max_dirty_pages_pct 90 innodb_max_purge_lag 0 innodb_mirrored_log_groups 1 innodb_open_files 300 innodb_rollback_on_timeout OFF innodb_stats_method nulls_equal innodb_stats_on_metadata ON innodb_support_xa ON innodb_sync_spin_loops 20 innodb_table_locks ON innodb_thread_concurrency 8 innodb_thread_sleep_delay 10000 innodb_use_legacy_cardinality_algorithm ON ---------------------- mysql>show status like ‘innodb%‘; ---------------- Innodb_buffer_pool_pages_data 2559 分配出去, 正在被使用頁的數量,包括臟頁。單位是page Innodb_buffer_pool_pages_dirty 0 臟頁但沒有被flush除去的頁面數。單位是page Innodb_buffer_pool_pages_flushed 795 已經flush的頁面數。單位是page Innodb_buffer_pool_pages_free 1473 當前空閑頁面數。單位是page Innodb_buffer_pool_pages_misc 64 緩存池中當前已經被用作管理用途或hash index而不能用作為普通數據頁的數目。單位是page Innodb_buffer_pool_pages_total 4096 緩沖區總共的頁面數。單位是page Innodb_buffer_pool_read_ahead_rnd 8 隨機預讀的次數 Innodb_buffer_pool_read_ahead_seq 1 順序預讀的次數 Innodb_buffer_pool_read_requests 1725871 從緩沖池中讀取頁的次數 Innodb_buffer_pool_reads 2108 從磁盤讀取頁的次數。緩沖池裏面沒有, 就會從磁盤讀取 Innodb_buffer_pool_wait_free 0 緩沖池等待空閑頁的次數,當需要空閑塊而系統中沒有時,就會等待空閑頁面 Innodb_buffer_pool_write_requests 2296 緩沖池總共發出的寫請求次數 Innodb_data_fsyncs 695 總共完成的fsync次數 Innodb_data_pending_fsyncs 0 innodb當前等待的fsync次數 Innodb_data_pending_reads 0 innodb當前等待的讀的次數 Innodb_data_pending_writes 0 innodb當前等待的寫的次數 Innodb_data_read 44044288 總共讀入的字節數 Innodb_data_reads 2191 innodb完成的讀的次數 Innodb_data_writes 1296 innodb完成的寫的次數 Innodb_data_written 26440192 總共寫出的字節數 Innodb_dblwr_pages_written 795 Innodb_dblwr_writes 90 Innodb_log_waits 0 因日誌緩存太小而必須等待其被寫入所造成的等待數。單位是次。 Innodb_log_write_requests 263 Innodb_log_writes 410 Innodb_os_log_fsyncs 500 Innodb_os_log_pending_fsyncs 0 Innodb_os_log_pending_writes 0 Innodb_os_log_written 343552 Innodb_page_size 16384 Innodb_pages_created 4 Innodb_pages_read 2555 Innodb_pages_written 795 Innodb_row_lock_current_waits 0 Innodb_row_lock_time 0 Innodb_row_lock_time_avg 0 Innodb_row_lock_time_max 0 Innodb_row_lock_waits 0 Innodb_rows_deleted 0 Innodb_rows_inserted 352 Innodb_rows_read 818617 Innodb_rows_updated 88 ------------------ 命中率=innodb_buffer_pool_read_requests / (innodb_buffer_pool_read_requests + innodb_buffer_pool_read_ahead + innodb_buffer_pool_reads) innodb_buffer_pool_size: 如果不使用InnoDB存儲引擎,可以不用調整這個參數,如果需要使用,在內存允許的情況下,盡可能將所有的InnoDB數據文件存放如內存中,同樣將但來說也是“越大越好” innodb_additional_pool_size 這個值不用分配太大,系統可以自動調。不用設置太高。通常比較大數據設置16M夠用了,如果表比較多,可以適當的增大。如果這個值自動增加,會在error log有中顯示的。20M足夠了。 innodb_log_file_size 作用:指定日誌的大小 分配原則:幾個日誌成員大小加起來差不多和你的innodb_buffer_pool_size相等。在高寫入負載尤其是大數據集的情況下很重要。這個值越大則性能相對越高,但是要註意到可能會增加恢復時間。 說明:這個值分配的大小和數據庫的寫入速度,事務大小,異常重啟後的恢復有很大的關系。 innodb_log_buffer_size: 作用:事務在內存中的緩沖。 分配原則:控制在2-8M.這個值不用太多的。他裏面的內存一般一秒鐘寫到磁盤一次。具體寫入方式和你的事務提交方式有關。一般最大指定為3M比較合適。 參考:Innodb_os_log_written(show global status 可以拿到) 如果這個值增長過快,可以適當的增加innodb_log_buffer_size 另外如果你需要處理大理的text,或是blog字段,可以考慮增加這個參數的值。 默認的設置在中等強度寫入負載以及較短事務的情況下,服務器性能還可以。如果存在更新操作峰值或者負載較大,就應該考慮加大它的值了。如果它的值設置太高了,可能會浪費內存 -- 它每秒都會刷新一次,因此無需設置超過1秒所需的內存空間。通常 8-16MB 就足夠了。越小的系統它的值越小。 innodb_flush_logs_at_trx_commit 作用:控制事務的提交方式 分配原則:這個參數只有3個值,0,1,2請確認一下自已能接受的級別。默認為1,主庫請不要更改了。性能更高的可以設置為0或是2,但會丟失一秒鐘的事務。 值為1時:innodb 的事務LOG在每次提交後寫入日誌文件,並對日誌做刷新到磁盤。這個可以做到不丟任何一個事務。 值為2事,也就是不把日誌刷新到磁盤上,而只刷新到操作系統的緩存上。日誌仍然會每秒刷新到磁盤中去,因此通常不會丟失每秒1-2次更新的消耗。如果設置為 0 就快很多了,不過也相對不安全了 -- MySQL服務器崩潰時就會丟失一些事務。設置為 2 只會丟失刷新到操作系統緩存的那部分事務。 innodb_file_per_table 作用:使每個Innodb的表,有自已獨立的表空間。如刪除文件後可以回收那部分空間。 分配原則:只有使用不使用。但DB還需要有一個公共的表空間。 InnoDB 默認會將所有的數據庫InnoDB引擎的表數據存儲在一個共享空間中:ibdata1,增刪數據庫的時候,ibdata1文件不會自動收縮,單個數據庫的備份也將成為問題。通常只能將數據使用mysqldump 導出,然後再導入解決這個問題。 查看是否開啟: mysql> show variables like ‘%per_table%’; 開啟 innodb_file_per_table=1 請適當的增加innodb_open_files innodb_open_files 作用:限制Innodb能打開的表的數據。 分配原則:如果庫裏的表特別多的情況,請增加這個。這個值默認是300。這個值必須超過你配置的innodb_data_file_path個數。 請適當的增加table_cache innodb_flush_method 作用:Innodb和系統打交道的一個IO模型 分配原則:Windows不用設置。UNIX可以設置:fdatasync (默認設置),O_DIRECT,和O_DSYNC O_DIRECT跳過了操作系統的文件系統Disk Cache,讓MySQL直接讀寫磁盤。 有數據表明,如果是大量隨機寫入操作,O_DIRECT會提升效率。但是順序寫入和讀取效率都會降低。 innodb_max_dirty_pages_pct 作用:控制Innodb的臟頁在緩沖中在那個百分比之下,值在範圍1-100,默認為90. O_DIRECT的flush_method更適合於操作系統內存有限的情況下(可以避免不必要的對交換空間的讀寫操作),否則,它會由於禁用了os的緩沖降低對數據的讀寫操作的效能。 使用memlock可以避免MySQL內存進入swap

mysql 通過查看mysql 配置參數、狀態來優化你的mysql