這時可以看到結果集還是條但是Extra中的filesort不見了這時mysql使用userid_clicks這個索引去查詢這不但能快速查詢到userid=admin的所有記錄並且結果是根據clicks排好序的!所以不用再把這個結果集讀入內存一條一條排序了效率上會高很多但是用多字段索引這種方式有個問題如果查詢的sql種類很多的話就得好好規劃一下了否則索引會建得非常多不但會影響到數據insert和update的效率而且數據表也容易損壞以上是對索引優化的辦法因為原因可能會比較復雜所以寫得比較的長一般好好優化了索引之後mysql的效率會提升n個檔次從而也不需要考慮增加機器來解決問題了但是mysql甚至所有數據庫可能都不好解決limit的問題在mysql中limit 只要索引合適是沒有問題的但是limit 就會很慢了因為mysql會掃描排好序的結果然後找到這個點取出條返回要找到這個點就要掃描條記錄這個循環是比較耗時的不知道會不會有什麼好的算法可以優化這個掃描引擎我冥思苦想也想不出有什麼好辦法對於limit目前直至比較久遠的將來我想只能通過業務程序和數據表的規劃來優化我想到的這些優化辦法也都還沒有一個是萬全之策往後再討論
sql寫法過於復雜
sql寫法假如用到一些特殊的功能比如groupby或者多表聯合查詢的話mysql用到什麼方式來查詢也可以用desc來分析我這邊用復雜sql的情況還不算多所以不常分析暫時就沒有好的建議
配置錯誤
配置裡主要參數是key_buffersort_buffer_size/myisam_sort_buffer_size這兩個參數意思是key_buffer=M全部表的索引都會盡可能放在這塊內存區域內索引比較大的話就開稍大點都可以我一般設為M有個好的建議是把很少用到並且比較大的表想辦法移到別的地方去這樣可以顯著減少mysql的內存占用sort_buffer_size=M單個線程使用的用於排序的內存查詢結果集都會放進這內存裡如果比較小mysql會多放幾次所以稍微開大一點就可以了重要是優化好索引和查詢語句讓他們不要生成太大的結果集
另外一些配置
thread_concurrency=這個配置標配=cpu數量x
interactive_timeout=
wait_timeout=這兩個配置使用秒就可以了這樣會盡快地釋放內存資源注意一直在使用的連接是不會斷掉的這個配置只是斷掉了長時間不動的連接
query_cache這個功能不要使用現在很多人看到cache這幾個字母就像看到了寶貝這是不唯物主義的mysql的query_cache在每次表數據有變化的時候都會重新清理連至該表的所有緩存如果更新比較頻繁query_cache不但幫不上忙而且還會對效率影響很大這個參數只適合只讀型的數據庫如果非要用也只能用query_cache_type=自行用SQL_CACHE指定一些sql進行緩存
max_connections默認為一般情況下是足夠用的但是一般要開大一點開到就可以了能超過的話一般就有效率問題得另找對策光靠增加這個數字不是辦法
其它配置可以按默認就可以了個人覺得問題還不是那麼的大提醒一下配置雖然很重要但是在絕大部分情況下都不是效率問題的罪魁禍首mysql是一個數據庫對於數據庫最重要考究的不應是效率而是穩定性和數據准確性
[] [] [] [] [] []
From:http://tw.wingwit.com/Article/program/MySQL/201311/29769.html