mysql 優(yōu)化(簡單的測試初狰,僅供參考)
查看mysql配置
show variables;
查看MySQL服務(wù)器運行的各種狀態(tài)值
show global status;
查看有多少慢查詢
show variables like '%slow%';
mysql 的鏈接數(shù)
show variables like 'max_connections';
show global status like 'max_used_connections';
-- max_used_connections / max_connections * 100% = ~ (理想值 ≈ 85%)
key_buffer_size是對MyISAM表性能影響最大的一個參數(shù), 不過數(shù)據(jù)庫中多為Innodb
show variables like 'key_buffer_size';
show global status like 'key_read%';
-- 計算索引未命中緩存的概率 key_cache_miss_rate = Key_reads / Key_read_requests * 100%
Key_blocks_unused表示未使用的緩存簇(blocks)數(shù)捍靠,Key_blocks_used表示曾經(jīng)用到的最大的blocks數(shù)
show global status like 'key_blocks_u%';
-- Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ ~(理想值 ≈ 80%)
臨時表
show global status like 'created_tmp%';
-- 每次創(chuàng)建臨時表阴挣,Created_tmp_tables增加畏线,如果是在磁盤上創(chuàng)建臨時表投队,Created_tmp_disk_tables
-- 也增加,Created_tmp_files表示MySQL服務(wù)創(chuàng)建的臨時文件文件數(shù):
-- Created_tmp_disk_tables / Created_tmp_tables * 100% = ~(理想值<= 25%)
show variables where Variable_name in ('tmp_table_size', 'max_heap_table_size');
open table 的情況
show global status like 'open%tables%';
-- Open_tables 表示打開表的數(shù)量八千,Opened_tables表示打開過的表數(shù)量馍惹,如果Opened_tables數(shù)量過
-- 大,說明配置中 table_cache(5.1.3之后這個值叫做table_open_cache)值可能太小龙宏,我們查詢一下服務(wù)
-- 器table_cache值
show variables like 'table_cache';
-- Open_tables / Opened_tables * 100% =~ 理想值 (>= 85%)
-- Open_tables / table_cache * 100% = ~ 理想值 (<= 95%)
進程使用情況
show global status like 'Thread%';
-- 如果我們在MySQL服務(wù)器配置文件中設(shè)置了thread_cache_size棵逊,當(dāng)客戶端斷開之后,服務(wù)器處理此客
-- 戶的線程將會緩存起來以響應(yīng)下一個客戶而不是銷毀(前提是緩存數(shù)未達上限)银酗。Threads_created表
-- 示創(chuàng)建過的線程數(shù)辆影,如果發(fā)現(xiàn)Threads_created值過大的話徒像,表明 MySQL服務(wù)器一直在創(chuàng)建線程,這也
-- 是比較耗資源蛙讥,可以適當(dāng)增加配置文件中thread_cache_size值锯蛀,查詢服務(wù)器 thread_cache_size配置:
show variables like 'thread_cache_size';
查詢緩存(query cache)
show global status like 'qcache%';
Qcache_free_blocks:緩存中相鄰內(nèi)存塊的個數(shù)。數(shù)目大說明可能有碎片键菱。FLUSH QUERY CACHE會對緩存中的碎片進行整理谬墙,從而得到一個空閑塊。
Qcache_free_memory:緩存中的空閑內(nèi)存经备。
Qcache_hits:每次查詢在緩存中命中時就增大
Qcache_inserts:每次插入一個查詢時就增大拭抬。命中次數(shù)除以插入次數(shù)就是不中比率。
Qcache_lowmem_prunes:緩存出現(xiàn)內(nèi)存不足并且必須要進行清理以便為更多查詢提供空間的次數(shù)侵蒙。這個數(shù)字最好長時間來看造虎;如果這個數(shù)字在不斷增長,就表示可能碎片非常嚴(yán)重纷闺,或者內(nèi)存很少算凿。(上面的 free_blocks和free_memory可以告訴您屬于哪種情況)
Qcache_not_cached:不適合進行緩存的查詢的數(shù)量,通常是由于這些查詢不是 SELECT 語句或者用了now()之類的函數(shù)犁功。
Qcache_queries_in_cache:當(dāng)前緩存的查詢(和響應(yīng))的數(shù)量氓轰。
Qcache_total_blocks:緩存中塊的數(shù)量。
我們再查詢一下服務(wù)器關(guān)于query_cache的配置:
show variables like 'query_cache%';
各字段的解釋:
query_cache_limit:超過此大小的查詢將不緩存
query_cache_min_res_unit:緩存塊的最小大小
query_cache_size:查詢緩存大小
query_cache_type:緩存類型浸卦,決定緩存什么樣的查詢署鸡,示例中表示不緩存 select sql_no_cache 查詢
query_cache_wlock_invalidate:當(dāng)有其他客戶端正在對MyISAM表進行寫操作時,如果查詢在query cache中限嫌,是否返回cache結(jié)果還是等寫操作完成再讀表獲取結(jié)果靴庆。
query_cache_min_res_unit的配置是一柄”雙刃劍”,默認是4KB怒医,設(shè)置值大對大數(shù)據(jù)查詢有好處炉抒,但如果你的查詢都是小數(shù)據(jù)查詢,就容易造成內(nèi)存碎片和浪費稚叹。
查詢緩存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
如果查詢緩存碎片率超過20%焰薄,可以用FLUSH QUERY CACHE整理緩存碎片,或者試試減小query_cache_min_res_unit扒袖,如果你的查詢都是小數(shù)據(jù)量的話塞茅。
查詢緩存利用率 = (query_cache_size – Qcache_free_memory) / query_cache_size * 100%
查詢緩存利用率在25%以下的話說明query_cache_size設(shè)置的過大,可適當(dāng)減辛鸥濉;查詢緩存利用率在80%以上而且Qcache_lowmem_prunes > 50的話說明query_cache_size可能有點小蟀伸,要不就是碎片太多蚀同。
查詢緩存命中率 = (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%
示例服務(wù)器 查詢緩存碎片率 = 20.46%缅刽,查詢緩存利用率 = 62.26%,查詢緩存命中率 = 1.94%蠢络,命中率很差衰猛,可能寫操作比較頻繁吧,而且可能有些碎片
排序使用情況
show global status like 'sort%';
Sort_merge_passes 包括兩步刹孔。MySQL 首先會嘗試在內(nèi)存中做排序啡省,使用的內(nèi)存大小由系統(tǒng)變量 Sort_buffer_size 決定,如果它的大小不夠把所有的記錄都讀到內(nèi)存中髓霞,MySQL 就會把每次在內(nèi)存中排序的結(jié)果存到臨時文件中卦睹,等 MySQL 找到所有記錄之后,再把臨時文件中的記錄做一次排序方库。這再次排序就會增加 Sort_merge_passes结序。實際上,MySQL 會用另一個臨時文件來存再次排序的結(jié)果纵潦,所以通常會看到 Sort_merge_passes 增加的數(shù)值是建臨時文件數(shù)的兩倍徐鹤。因為用到了臨時文件,所以速度可能會比較慢邀层,增加 Sort_buffer_size 會減少 Sort_merge_passes 和 創(chuàng)建臨時文件的次數(shù)返敬。但盲目的增加 Sort_buffer_size 并不一定能提高速度,見 How fast can you sort data with MySQL?(引自http://qroom.blogspot.com/2007/09/mysql-select-sort.html)
另外寥院,增加read_rnd_buffer_size(3.2.3是record_rnd_buffer_size)的值對排序的操作也有一點的好處劲赠,參見:http://www.mysqlperformanceblog.com/2007/07/24/what-exactly-is- read_rnd_buffer_size/
文件打開數(shù)(open_files)
show global status like 'open_files';
show variables like 'open_files_limit';
-- 比較合適的設(shè)置:Open_files / open_files_limit * 100% <= 75%
表鎖情況
show global status like 'table_locks%';
-- Table_locks_immediate 表示立即釋放表鎖數(shù),Table_locks_waited表示需要等待的表鎖數(shù)只磷,如果
-- Table_locks_immediate / Table_locks_waited > 5000经磅,最好采用InnoDB引擎,因為InnoDB是行鎖而
-- MyISAM是表鎖钮追,對于高并發(fā)寫入的應(yīng)用InnoDB效果會好些.
表掃描情況
show global status like 'handler_read%';
各字段解釋參見http://hi.baidu.com/thinkinginlamp/blog/item/31690cd7c4bc5cdaa144df9c.html预厌,調(diào)出服務(wù)器完成的查詢請求次數(shù)
show global status like 'com_select';
-- 計算表掃描率:
-- 表掃描率 = Handler_read_rnd_next / Com_select
-- 如果表掃描率超過4000,說明進行了太多表掃描元媚,很有可能索引沒有建好轧叽,增加read_buffer_size值會
-- 有一些好處,但最好不要超過8MB刊棕。
文章來源<(-