如果是root帳號,你能看到所有用戶的當前連接。如果是其它普通帳號,只能看到自己占用的連接
怎么進入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 服務器工作了多少秒。
關於上面的一些注釋:
如果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可省
show status like 'Com_%'
顯示全局統計使用
SHOW GLOBAL STATUS LIKE 'COM_%';
2. 查看針對InnoDB存儲引擎狀態的統計
SHOW GLOBAL STATUS LIKE 'Innodb_%'
紅色部分可以看到插入 刪除 讀取 更新的行的匯總數量。無論事務提交還是回滾,都進行累加。
3. 查看試圖連接mySQL服務器的次數
show global status like 'connections'
4. 查看服務器工作時間
show global status like 'uptime'
練習2:通過explain 分析低效SQL的執行計划
1. 使用explain 分析SQL語句
explain select * from TStudent where studentID='00034'
explain select * from TStudent where cardID like '%45%'
2. 確定問題並采取相應措施
如果出現對大表的全表掃描,應該在該列創建索引,並且盡量避免使用like這樣的條件進行查找。
explain select * from TStudent where studentID like '%3%'
注意以下這個查詢使用索引進行的,大家想想為什么?
explain select * from TStudent where studentID like '0003%'
練習3:通過索引優化查詢
3. 索引的存儲分類
MySQL中的索引的存儲類型目前只有BTREE和HASH,具體和表的存儲引擎有關。myISAM和InnoDB存儲引擎都支持BTREE。Memory/Heap存儲引擎可以支持HASH和BTREE
4. MySQL如何使用索引-組合索引的使用
索引用戶快速找出某一列中有一特定值的行,查詢使用索引的主要條件是查詢條件中使用索引關鍵字,多列索引只有在查詢條件中使用最左面的前綴,才使用索引。
在TSCore表上創建了組合主鍵。
查詢
explain select * from TScore where studentID='00023'
explain select * from TScore where subjectID='00001'
可以看到是全表掃描
5. 條件語句中使用Like
explain select * from TStudent where studentID like '%3%'
注意以下這個查詢使用索引進行的,大家想想為什么?
explain select * from TStudent where studentID like '0003%'
如果列是索引,查找空值使用索引,以下是給sname列創建索引
alter table `TStudent` add index indexName(sname)
查看查詢計划
explain select * from TStudent where sname is null
6. 不適用索引的情況
如果查詢的結果站記錄總數的大多數,就不適用索引。
如果條件語句中有or or前面的列有索引,后面列沒索引,兩個索引都不用。
如果列類型是字符串,一定要用' ' 否則不使用索引查詢數據。
explain select * from TStudent where studentid=00051
explain select * from TStudent where studentid='00051'
7. 查看索引使用情況
show status like 'Handler_read%'
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數據引擎。
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();
通過拆分提高表的訪問效率
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%'
20. 查看鎖
當上面出現鎖等待的情況下,使用putty連接輸入以下命令
show global status like 'innodb_row_lock%'
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%'
如果Table_locks_waited的值比較高,則說明存在着較嚴重的表級鎖爭用情況。
Table_locks_immediate表示立即釋放表鎖數
等待的鎖不多,就不需要使用InnoDb
優化mySQL
練習6:查看mysql參數
和大多數數據庫一樣,MySQL也提供了很多參數來進行服務器的設置。
21. 查看mySQL Server參數
show variables
查看當前會話狀態
show status
查看全局狀態
show global status
22. 影響mySQL性能的重要參數
將索引加到緩存,能夠提高查找速度。
絕大多數參數不需要用戶調整,key_buffer_size參數,用來設置索引塊緩存的大小,被所有線程共享,此參數適用於MyISAM存儲引擎。
使用putty連接mySQL設置這個參數
set global hot_cache2.key_buffer_size=128*1024;
global標識對每一個新的連接,此參數都將生效,hot_cache2是新的key_buffer名稱。
然后可以把相關表的索引放到指定的索引緩存中。
將相關表索引放到指定的索引緩存中。
可以看到有兩個索引
將TStudent表的索引加載到緩存。
磁盤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%'
按順序執行以下命令查看緩存的數量
show status like 'Qcache%'
Select class from TStudent where studentID='00046';
Select class from TStudent where studentID='00056'
show status like 'Qcache%'
增加cache層
在應用端增加cache層來減輕數據庫負擔的目的,cache層有很多種,也有很多證實現方式。
比如,把部分數據從數據庫抽取出來放到應用端以文本形式存儲,如果有查詢需求就直接重文本(cache)中查詢。由於cache中數據量小,能夠達到較高的訪問效率。但是也涉及到數據更新,需要及時刷新cache。
負載均衡
負載均衡是一種在實際應用中非常普遍的方法。從Web服務器到數據庫服務器都可以使用負載均衡。現在介紹mySQL負載均衡方法。
利用mySQL復制分流查詢操作
主服務器負載數據更改,從服務器負載查詢。數據復制的延遲需要考慮。
采用分布式數據庫架構
MySQL cluster適用於大數據量,負載高的情況,有良好的擴展性和高可用性。