mysql性能監控相關

若是是root賬號,你能看到全部用戶的當前鏈接。若是是其它普通賬號,只能看到本身佔用的鏈接mysql

怎麼進入mysql命令行呢? mysql的安裝目錄下面有個bin目錄,先用命令行進入該目錄,而後用 mysql -uroot -p123456 來登陸(注意:用戶名和密碼不用包含「」) 
命令: show processlist; 
若是是root賬號,你能看到全部用戶的當前鏈接。若是是其它普通賬號,只能看到本身佔用的鏈接。 
show processlist;只列出前100條,若是想全列出請使用show full processlist; 
mysql> show processlist; 
命令: show status; 
命令:show status like '%下面變量%'; 
Aborted_clients 因爲客戶沒有正確關閉鏈接已經死掉,已經放棄的鏈接數量。 
Aborted_connects 嘗試已經失敗的MySQL服務器的鏈接的次數。 
Connections 試圖鏈接MySQL服務器的次數。 
Created_tmp_tables 當執行語句時,已經被創造了的隱含臨時表的數量。 
Delayed_insert_threads 正在使用的延遲插入處理器線程的數量。 
Delayed_writes 用INSERT DELAYED寫入的行數。 
Delayed_errors 用INSERT DELAYED寫入的發生某些錯誤(可能重複鍵值)的行數。 
Flush_commands 執行FLUSH命令的次數。 
Handler_delete 請求從一張表中刪除行的次數。 
Handler_read_first 請求讀入表中第一行的次數。 
Handler_read_key 請求數字基於鍵讀行。 
Handler_read_next 請求讀入基於一個鍵的一行的次數。 
Handler_read_rnd 請求讀入基於一個固定位置的一行的次數。 
Handler_update 請求更新表中一行的次數。 
Handler_write 請求向表中插入一行的次數。 
Key_blocks_used 用於關鍵字緩存的塊的數量。 
Key_read_requests 請求從緩存讀入一個鍵值的次數。 
Key_reads 從磁盤物理讀入一個鍵值的次數。 
Key_write_requests 請求將一個關鍵字塊寫入緩存次數。 
Key_writes 將一個鍵值塊物理寫入磁盤的次數。 
Max_used_connections 同時使用的鏈接的最大數目。 
Not_flushed_key_blocks 在鍵緩存中已經改變可是還沒被清空到磁盤上的鍵塊。 
Not_flushed_delayed_rows 在INSERT DELAY隊列中等待寫入的行的數量。 
Open_tables 打開表的數量。 
Open_files 打開文件的數量。 
Open_streams 打開流的數量(主要用於日誌記載) 
Opened_tables 已經打開的表的數量。 
Questions 發往服務器的查詢的數量。 
Slow_queries 要花超過long_query_time時間的查詢數量。 
Threads_connected 當前打開的鏈接的數量。 
Threads_running 不在睡眠的線程數量。 
Uptime 服務器工做了多少秒。sql

關於上面的一些註釋:數據庫

若是Opened_tables太大,那麼你的table_cache變量可能過小。 
若是key_reads太大,那麼你的key_cache可能過小。緩存命中率能夠用key_reads/key_read_requests計算。 
若是Handler_read_rnd太大,那麼你極可能有大量的查詢須要MySQL掃描整個表或你有沒正確使用鍵值的聯結(join)。 
能夠根據「show status」命令返回的狀態進行微調。我主要注意如下變量的數值,越小越好,最好爲零:)
        Created_tmp_disk_tables
        Created_tmp_tables
        Created_tmp_files
        Slow_queries

 

 

1. Show status命令瞭解各類SQL的執行頻率緩存

查看當前會話執行的各項命令統計 com_XXX服務器

show session status like 'Com_%' 其中session可省session

show status like 'Com_%'架構

顯示全局統計使用併發

SHOW GLOBAL STATUS LIKE 'COM_%';負載均衡

clip_image004[4]

clip_image005[4]

2. 查看針對InnoDB存儲引擎狀態的統計分佈式

SHOW GLOBAL STATUS LIKE 'Innodb_%'

clip_image006[4]

紅色部分能夠看到插入 刪除 讀取 更新的行的彙總數量。不管事務提交仍是回滾,都進行累加。

3. 查看試圖鏈接mySQL服務器的次數

show global status like 'connections'

clip_image007[4]

4. 查看服務器工做時間

show global status like 'uptime'

練習2:經過explain 分析低效SQL的執行計劃

1. 使用explain 分析SQL語句

explain select * from TStudent where studentID='00034'

clip_image008[4]

explain select * from TStudent where cardID like '%45%'

clip_image009[4]

2. 肯定問題並採起相應措施

若是出現對大表的全表掃描,應該在該列建立索引,而且儘可能避免使用like這樣的條件進行查找。

explain select * from TStudent where studentID like '%3%'

clip_image010[4]

注意如下這個查詢使用索引進行的,你們想一想爲何?

explain select * from TStudent where studentID like '0003%'

clip_image011[4]

練習3:經過索引優化查詢

3. 索引的存儲分類

MySQL中的索引的存儲類型目前只有BTREE和HASH,具體和表的存儲引擎有關。myISAM和InnoDB存儲引擎都支持BTREE。Memory/Heap存儲引擎能夠支持HASH和BTREE

4. MySQL如何使用索引-組合索引的使用

索引用戶快速找出某一列中有一特定值的行,查詢使用索引的主要條件是查詢條件中使用索引關鍵字,多列索引只有在查詢條件中使用最左面的前綴,才使用索引。

在TSCore表上建立了組合主鍵。

clip_image012[4]

查詢

explain select * from TScore where studentID='00023'

clip_image013[4]

explain select * from TScore where subjectID='00001'

能夠看到是全表掃描

clip_image014[4]

5. 條件語句中使用Like

explain select * from TStudent where studentID like '%3%'

clip_image010[5]

注意如下這個查詢使用索引進行的,你們想一想爲何?

explain select * from TStudent where studentID like '0003%'

clip_image011[5]

若是列是索引,查找空值使用索引,如下是給sname列建立索引

alter table `TStudent` add index indexName(sname)

查看查詢計劃

explain select * from TStudent where sname is null

clip_image015[4]

6. 不適用索引的狀況

若是查詢的結果站記錄總數的大多數,就不適用索引。

若是條件語句中有or or前面的列有索引,後面列沒索引,兩個索引都不用。

若是列類型是字符串,必定要用' ' 不然不使用索引查詢數據。

explain select * from TStudent where studentid=00051

clip_image016[4]

explain select * from TStudent where studentid='00051'

clip_image017[4]

7. 查看索引使用狀況

show status like 'Handler_read%'

clip_image018[4]

8. 兩個簡單的實用的優化方法

按期分析和檢查表

analyze table TStudent

本語句用於分析和存儲表的關鍵字分佈,分析的結果將可使的系統獲得準確的統計信息,使得SQL可以生成正確的執行計劃。

check table TStudent

本語句的做用是檢查一個或多個表是否有錯誤,check table對MyISAM和InnoDB表有做用。

經常使用的SQL的優化

9. 優化Insert語句

若是從同一個客戶端一次插入不少行,儘可能使用下面的語句,能大大縮減客戶端與數據庫之間的鏈接、關閉等消耗。

insert student values

(45,'李雙江','212121212121212121121','北京海淀區','213322323232'),

(46,'馮玲娥','212121212121212121121','北京海淀區','213322323232'),

(47,'李雙江','212121212121212121121','北京海淀區','213322323232')

不要使用如下語句

insert student values (45,'李雙江','212121212121212121121','北京海淀區','213322323232');

insert student values (46,'馮玲娥','212121212121212121121','北京海淀區','213322323232');

insert student values (47,'李雙江','212121212121212121121','北京海淀區','213322323232');

10. 使用delayed選項

若是從多個客戶端插入不少行,能經過使用INSERT delayed語句獲得更高的速度。其含義是讓INSERT語句立刻執行,其實數據都被放在內存的隊列中,並無真正寫入磁盤。這比每條語句分別插入要快的多。LOW_PRIORITY恰好相反,在全部其餘用戶對錶的讀寫完後才進行插入。

該參數支持MyISAM數據引擎。

clip_image019[4]

insert delayed student values (46,'馮玲娥','212121212121212121121','北京海淀區','213322323232');

11. 將索引文件和數據文件分別放到不一樣的盤

12. RAID磁盤

13. 從文件裝載一個表時,使用load data infile 比insert語句塊20倍

14. 可使用一個索引來知足Order by,不須要額外的排序。Where條件和Order by 使用相同的索引,而且order by的順序和索引順序相同。

15. 優化嵌套子查詢 子查詢能夠被更有效率的join替代,使用join不須要在內存中使用臨時表。

16. MySQL如何優化or條件 兩個條件必須有索引,不然不是用索引

優化數據庫對象

練習4:優化表的數據類型

使用PROCEDURE ANALYSE()來對錶進行分心,該函數能夠對數據表中列的數據類型提出優化建議。

select * from TStudent PROCEDURE ANALYSE();

clip_image020[4]

經過拆分提升表的訪問效率

17. 垂直拆分

將一個有不少列的表,分解成多個表,使用主鍵進行關聯,可使數據行變小,一頁就能存放更多的數據,使用jion進行鏈接。若是一個表,有的列經常使用,有些列不經常使用,就能夠垂直拆分。

18. 水平拆分

根據一列或多列數據的值把數據行放到兩個隊表中。如下狀況使用水平拆分

1. 表很大 分割後能夠下降查詢時須要讀的數據和索引的頁數。同時也下降了索引的層數,提升查詢速度。

2. 表中的數據有很強的獨立性 好比表中數據,記錄不一樣地區或不一樣時間的數據。特別是有些數據經常使用,有些不經常使用。

3. 須要把數據放到多個介質上。放到不一樣的硬盤。

這種查詢須要使用多個表名,使用UNION將結果鏈接起來,增長了操做的複雜性。

逆規範化

規範化,下降了數據冗餘,以及數據修改引發的數據不一致。可是須要多個表進行jion,下降了查詢的性能,爲了性能考慮,不嚴格使用規範化設計數據庫。

反規範化的好處,下降鏈接操做的需求,下降外鍵和索引的數目,還能減小表的數量。

經常使用的反規範化技術有:

1. 增長數據冗餘

2. 增長派生列

3. 從新組表

4. 分割表

反規範化技術須要維護數據的完整性。經常使用的維護完整性方法有:

5. 批處理 是指按期運行批處理做業或存儲過程對派生列進行修改,這在實時性要求不高的狀況使用

6. 由應用邏輯來實現 使用事務,在一個事務中對全部涉及到的表進行增刪改操做。由於同一邏輯必須在全部應用中使用和維護,容易遺漏,特別是在需求變化大時,不易維護。

7. 使用觸發器實現,易於維護。

使用中間表提升統計查詢速度

好比一個表記錄了客戶天天的消費記錄,你須要統計用戶本週客戶消費總金額和近一週不一樣時間段用戶的消費總金額。你就應該將本週的數據插入到一個新表,而後使用新表進行統計。

優勢:

8. 中間表與源表隔離

9. 中間表能夠靈活添加索引或增長臨時用字段。從而達到提升統計查詢效率和輔助統計查詢的做用。

鎖問題

MySQL不一樣的存儲引擎支持不一樣的鎖機制。myISAM和MEMORY存儲引擎採用表級鎖;BDB存儲引擎採用的是頁面鎖,也支持表級鎖;InnoDB及支持行級鎖、也支持表級鎖,默認狀況是採用行級鎖。

MySQL有三個級別的鎖。

三種鎖地特性:

表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的機率最高,併發度最低。

行級鎖:開銷稍大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的機率最低,併發度也最高。

頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度通常。

練習5:查看鎖

這是myISAM存儲引擎支持表鎖,這也是早起mySQL版本中惟一支持的鎖類型。

19. 查詢表級鎖爭用狀況

show status like 'table%'

clip_image021[4]

20. 查看鎖

當上面出現鎖等待的狀況下,使用putty鏈接輸入如下命令

show global status like 'innodb_row_lock%'

clip_image022[4]

Innodb_row_lock_current_waits:當前正在等待鎖定的數量;

Innodb_row_lock_time:從系統啓動到如今鎖定總時間長度;

Innodb_row_lock_time_avg:每次等待所花平均時間;

Innodb_row_lock_time_max:從系統啓動到如今等待最常的一次所花的時間;

Innodb_row_lock_waits:系統啓動後到如今總共等待的次數;

輸入如下命令,查看全局的表鎖

show global status like 'table%'

clip_image023[4]

若是Table_locks_waited的值比較高,則說明存在着較嚴重的表級鎖爭用狀況。

Table_locks_immediate表示當即釋放表鎖數

等待的鎖很少,就不須要使用InnoDb

優化mySQL

練習6:查看mysql參數

和大多數數據庫同樣,MySQL也提供了不少參數來進行服務器的設置。

21. 查看mySQL Server參數

show variables

clip_image024[4]

查看當前會話狀態

show status

clip_image025[4]

查看全局狀態

show global status

clip_image026[4]

22. 影響mySQL性能的重要參數

將索引加到緩存,可以提升查找速度。

絕大多數參數不須要用戶調整,key_buffer_size參數,用來設置索引塊緩存的大小,被全部線程共享,此參數適用於MyISAM存儲引擎。

使用putty鏈接mySQL設置這個參數

set global hot_cache2.key_buffer_size=128*1024;

global標識對每個新的鏈接,此參數都將生效,hot_cache2是新的key_buffer名稱。

而後能夠把相關表的索引放到指定的索引緩存中。

將相關表索引放到指定的索引緩存中。

clip_image027[4]

能夠看到有兩個索引

clip_image028[4]

將TStudent表的索引加載到緩存。

clip_image029[4]

磁盤I/O問題

使用磁盤陣列

23. RAID技術

RAID-0 讀寫快 無冗餘

RAID-1 讀快 寫通常 有冗餘 有一半的磁盤浪費

RAID-10 先作RAID-1 在作RAID -0 讀寫性能好

RAID-4 使用一個單獨的磁盤存放校驗數據,當一個磁盤壞掉,

RAID-5 將校驗數據分佈在多個磁盤 寫性能不如RAID 0、RAID 1和RAID 10,出現壞盤,讀性能降低。

RAID技術有硬件實現的也有軟件實現的,即操做系統實現的。

應用優化

減小對mySQL的訪問

要想提升訪問速度,可以一次鏈接就能取的全部結果,就不要分兩步。這樣可以大大減小對數據庫無謂的重複訪問。

例如

第一個查詢獲得用戶學號和姓名

Select studentID,sname from TStudent where studentID='00005'

第二個查詢獲得用戶的班級

Select class from TStudent where studentID='00005'

這樣就須要想數據庫提交兩次查詢。

使用一個SQL語句實現,將class放到變量以備後用。

Select studentID,sname, class from TStudent where studentID='00005'

練習7:使用查詢緩存

MySQL的查詢緩存,就是將select語句查詢的結果放到緩存,再遇到個相同的查詢,服務器就會從查詢緩存中從新獲得查詢結果,再也不須要解析和執行查詢。

適合更新不頻繁的表。表結構和數據更改後,查詢緩存值的相關條目被清空。

show variables like '%query_cache%'

clip_image030[4]

按順序執行如下命令查看緩存的數量

show status like 'Qcache%'

Select class from TStudent where studentID='00046';

Select class from TStudent where studentID='00056'

show status like 'Qcache%'

clip_image031[4]

增長cache層

在應用端增長cache層來減輕數據庫負擔的目的,cache層有不少種,也有不少證明現方式。

好比,把部分數據從數據庫抽取出來放到應用端以文本形式存儲,若是有查詢需求就直接重文本(cache)中查詢。因爲cache中數據量小,可以達到較高的訪問效率。可是也涉及到數據更新,須要及時刷新cache。

負載均衡

負載均衡是一種在實際應用中很是廣泛的方法。從Web服務器到數據庫服務器均可以使用負載均衡。如今介紹mySQL負載均衡方法。

利用mySQL複製分流查詢操做

主服務器負載數據更改,從服務器負載查詢。數據複製的延遲須要考慮。

採用分佈式數據庫架構

MySQL cluster適用於大數據量,負載高的狀況,有良好的擴展性和高可用性。

相關文章
相關標籤/搜索