MYSQL效能檢測和優化

2021-06-18 06:37:27 字數 2373 閱讀 2832

首先是如何檢查sql的效率.

1.善用explain:

設計sql後,應使用explain命令檢查sql,看是否使用到索引,是否存在filesort,重點檢查檢索的行數(rows)是否太大。

一般來說.

rows<1000,是在可接受的範圍內的。

rows在1000~1w之間,在密集訪問時可能導致效能問題,但如果不是太頻繁的訪問(頻率低於1分鐘一次),又難再優化的話,可以接受,但需要注意觀察

rows大於1萬時,應慎重考慮sql的設計,優化sql,優化db,一般來說不允許頻繁執行(頻率低於1小時一次)。

rows達到10w級別時,堅決不能做為實時執行的sql。但導資料場合除外,但導資料必須控制好時間,頻度。

explain sql語句應該是日常開發中的習慣動作,有時explain出來的結果,可能會出於偏離設計的意料之外,所以

**強烈建議在設計sql,尤其是稍微複雜的sql時,一定要在測試環境甚至是實際環境上預先進行explain**

2.mysql慢查詢日誌

一般應開啟mysql的慢查詢日誌(在my.cnf中加入log_slow_queries和long_query_time兩個引數),會記錄所有查詢持續時間超過long_query_time的sql語句,把這些語句log下來之後,再一一分析(explain)優化。

3.監視當前程序

登陸mysql,使用showprocesslist檢視正在執行的sql語句,如果正在執行的語句太多,執行時間太長,表示mysql效率有問題。必要的時候可以將對應的程序kill掉。

4.系統命令

使用top/vmstat等系統命令來檢查mysql程序占用的cpu,記憶體,以及磁碟io量。

對mysql優化的文章很多,這裡只提幾點平時工作中比較常用到的方法。

建表時,顯式指定使用innodb資料庫引擎,而不是myisam,myisam引擎的鎖是表鎖,讀鎖和寫鎖是互斥的,讀寫操作是序列的,鎖衝突會嚴重影響併發.而innodb提供行級鎖,能提供較好的併發表現,在我們的業務場景裡,也不會引起死鎖。

善用索引,對sql語句where條件裡使用到的字段,合理建立索引。雖然對錶建立索引一定程度上會影響寫入效率,但在表資料規模不大,寫入壓力不是特別高的情況下,索引帶來的好處是更多的。

當sql語句是由**動態生成的,如在執行時根據使用者操作加入不同的where引數,應在測試階段對sql生成的典型情況和邊界情況進行測試,看是否有可能造成效能問題。並應適當生成一些日誌,供提取最終生成的sql進行效率分析。

對資料應合理分庫分表,由應用層去動態的選擇庫和表。mysql的innodb表雖然理論上可以裝海量的資料,但在我們的業務場景下,資料控制在500w以下會比較合理,追求效能的話,最好控制在200w以下,合理索引。

需要聯合查詢時善用center join/center join而不是直接多表聯合,怎麼用,查manul ^_^

盡量不要使用select套select的復合查詢,如果能拆開,盡量拆開,多條精悍的sql,組合起來可能就是一條龐大的sql,應該避免。

善用cache,將不常修改的,資料量有限的,又是被密集查詢的資訊,載入到cache裡,可以有效的降低資料庫壓力。在一般的業務場景裡,推薦使用開源memcache,簡單高效。

如果一些邏輯可以放到應用層去完成,可以考慮放到應用層去完成。但如果將sql邏輯分拆到應用層可能導致對資料更頻繁的訪問的話,那麼需要考慮修改應用邏輯,資料結構,或回到合理的聯合查詢上來。

比如某些資料的排序可以load到php陣列裡,再sort.又比如需要查詢a,b兩個表,a表裡的資料是b表裡某個欄位的對照說明(如 a:t_service表,b.t_task表),a表資料量有限,可以做聯合查詢,也可以先將a表先load到程序或記憶體裡,用hash結構cache 起來,再查b表,然後在cache裡依次查詢hash,獲得對照說明。

關於導資料和統計性查詢.導資料在計算和磁碟io上對資料庫壓力都會很大,應在時間和空間上合理分攤資料庫壓力如果需要匯出批量的特定資料做分析,應建立專供資料分析的資料庫伺服器,或者建立臨時庫表,先導出資料,再在上面做分析運算。

導資料等可能引起批量資料讀取的操作,應建立定時任務,在資料庫不繁忙的時段(凌晨1~7時)執行一般的統計操作,對實時性要求都不會太高(5~10分鐘以上,甚至一天,一周等),這種資料不應在每次訪問時執行庫中直接count,group,而是應該由定時任務匯出,建立結果表或中間結果表,供終端使用者使用。

生產資料庫上的操作許可權應嚴格控制,而開發人員在生產資料庫上直接執行sql語句,要盡量慎重。

能做到以上這些,基本上可以算mysql以及相關系統優化入門,可以保證不要讓我們的資料庫整天累趴下了。

最後,即使做足了功課,也還是要例行的對資料庫運**況進行觀察,監控,盡早發現其效能瓶頸,在未造成危害前解決掉。

通過分割槽(partition)提公升mysql效能

用好select索引 提高mysql查詢統計速度

php實現的mysql讀寫分離

Mysql效能檢測及優化

本文參考 一.mysql優化思路 1.週期性的故障 1 訪問高峰或快取崩潰 增加快取,並修改快取失效策略,失效時間分散 2.通過show processlist 或者 開啟慢查詢日誌,獲取有問題的sql profiling 和 explain 分析sql語句 1 sql語句等待時間長 對伺服器引數優...

mysql效能優化 mysql效能優化

優化方式 1.空間換時間 冗餘 2.時間換空間 字段優先使用型別 int date char varchar text 索引型別 btree索引 hash索引 索引的葉子下,存放乙個資訊指向所在行的資料位址。btree有利於範圍查詢,hash有利於精確查詢。btree用的更多一些。btree索引的常...

mysql的效能優化 mysql效能優化

檢視安裝指令碼 select version 非互動式超時時間,如jdbc show global variables like wait timeout 互動式超時時間,如資料庫工具 show global variables like interactive timeout show sessi...