1.定位須要優化的地方mysql
開啓慢查詢 sql
my.ini log-slow-queries=/data;long_query_time = 5 ;log-queries-not-using-indexes緩存
set global slow_query_log=on服務器
查看慢查詢日誌 mysqldumpslow併發
2.使用explain(type,key),profiling(show profiles;show profile for query id)函數
-----------------------------------------------性能
配置優化大數據
1.connections的使用率優化
connection_used_rate = max_used_connections/max_connections * 100%(理想85%)spa
若是服務器的併發鏈接請求量比較大,建議調高此值,以增長並行鏈接數量,固然這創建在機器能支撐的狀況下,由於若是鏈接數越多,介於MySQL會爲每一個鏈接提供鏈接緩衝區,就會開銷越多的內存,因此要適當調整該值,不能盲目提升設值
show variables like ‘max_connections’ 最大鏈接數
show status like ‘max_used_connections’響應的鏈接數
2.myisam索引緩存 key_buffer_size innodb 是innodb_buffer_pool_size
指定索引緩衝區的大小,它決定索引處理的速度,尤爲是索引讀的速度。經過檢查狀態值Key_read_requests和Key_reads,能夠知道key_buffer_size設置是否合理。比例key_reads / key_read_requests應該儘量的低,至少是1:100,1:1000更好
show variables like ‘key_buffer_size‘;
show global status like ‘key_read%‘;
key_reads直接從硬盤讀取索引的次數
key_read_requests 索引請求次數
key_cache_miss_rate =Key_reads / Key_read_requests * 100%,設置在1/1000左右較好
3.查詢結果緩衝 query_cache_size
mysql將查詢結果存放到緩衝區,注意對select語句是區分大小寫的
show global status like 'qcache%';
show global status like 'query_cache%';
判斷query_cache_size設置是否合理:
查詢緩存碎片率 = qcache_free_blocks /qcache_total_blocks *100%(查詢緩存碎片率超過20%,能夠用FLUSH QUERY CACHE整理緩存碎片,或者試試減少query_cache_min_res_unit,若是你的查詢都是小數據量的話)
查詢緩存利用率 = (query_cache_size - qcache_free_memory)/query_cache_size*100%(查詢緩存利用率在25%如下的話說明query_cache_size設置的過大,可適當減少;查詢緩存利用率在80%以上並且Qcache_lowmem_prunes > 50的話說明query_cache_size可能有點小,要不就是碎片太多)
緩存命中率 = (qcache_hits - qcache_inserts)/qcache_hits*100%
若是Qcache_lowmem_prunes 值比較大,表示查詢緩存區大小設置過小,須要增大。
若是Qcache_free_blocks 較多,表示內存碎片較多,須要清理,flush query cache
query_cache_min_res_unit = (query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache
MySQL查詢緩存變量解釋:
Qcache_free_blocks:緩存中相鄰內存塊的個數。數目大說明可能有碎片。FLUSH QUERY CACHE會對緩存中
的碎片進行整理,從而獲得一個空閒塊。
Qcache_free_memory:緩存中的空閒內存。
Qcache_hits:每次查詢在緩存中命中時就增大
Qcache_inserts:每次插入一個查詢時就增大。命中次數除以插入次數就是不中比率。
Qcache_lowmem_prunes:緩存出現內存不足而且必需要進行清理以便爲更多查詢提供空間的次數。這個數字
最好長時間來看;若是這個 數字在不斷增加,就表示可能碎片很是嚴重,或者內存不多。(上面的
free_blocks和free_memory能夠告訴您屬於哪一種狀況)
Qcache_not_cached:不適合進行緩存的查詢的數量,一般是因爲這些查詢不是 SELECT 語句或者用了now()
之類的函數。
Qcache_queries_in_cache:當前緩存的查詢(和響應)的數量。
Qcache_total_blocks:緩存中塊的數量。
query_cache_limit:超過此大小的查詢將不緩存
query_cache_min_res_unit:緩存塊的最小大小
query_cache_size:查詢緩存大小
query_cache_type:緩存類型,決定緩存什麼樣的查詢,示例中表示不緩存 select sql_no_cache 查詢
query_cache_wlock_invalidate:當有其餘客戶端正在對MyISAM表進行寫操做時,若是查詢在query cache
中,是否返回cache結果仍是等寫操做完成再讀表獲取結果。
query_cache_min_res_unit的配置是一柄」雙刃劍」,默認是4KB,設置值大對大數據查詢有好處
4.表緩衝 table_cache
經過檢查峯值時間的狀態值Open_tables和Opened_tables,能夠決定是否須要增長table_cache的值。若是你發現open_tables等於table_cache,而且opened_tables在不斷增加,那麼你就須要增長table_cache的值了(上述狀態值可使用SHOW STATUS LIKE ‘Open%tables’得到)。注意,不能盲目地把table_cache設置成很大的值。若是設置得過高,可能會形成文件描述符不足,從而形成性能不穩定或者鏈接失敗
5.臨時表緩衝tmp_table_size
show global status like ‘created_tmp%‘;
緩衝區使用率= 1-Created_tmp_disk_tables / Created_tmp_tables * 100%
每次建立臨時表,Created_tmp_tables增長,若是臨時表大小超過tmp_table_size,則是在磁盤上建立臨時表,Created_tmp_disk_tables也增長,Created_tmp_files表示MySQL服務建立的臨時文件文件數
建議儘可能優化查詢,要確保查詢過程當中生成的臨時表在內存中,避免臨時表過大致使生成基於硬盤的MyISAM表