MySql:監控及優化
1、mysql的生命周期
①MySql服務器監聽3306端口
②驗證訪問用戶
③創建mysql線程
④檢查內存(Qcache)
⑤解析sql
⑥生成查詢計劃
⑦打開表
⑧檢查內存(Buffer Pool)
⑨到磁盤取數據
⑩寫入內存
①①返回數據給客戶端
①②關閉表
①③關閉線程
①④關閉連接
2、mysql配置
linux下兩種進入mysql的方式:
①設置別名
②將mysql的/opt/lampp/bin/目錄加入環境變量
③讓設置的別名永久生效
vi ~/.bashrc
alias my=‘/opt/lampp/bin/mysql -uroot -p123456‘
source ~/.bashrc
mysql安裝完成後,最大默認連接數是100,連接數設置小的話,會影響性能
mysql配置文件的位置:
[[email protected] ~]# find / -name my.cnf
/opt/lampp/etc/my.cnf → 使用lampp的mysql
/etc/my.cnf → Linux系統自帶mysql配置文件的位置
mysql設置編碼方式:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8
mysql最大連接數設置:
在配置文件的[mysqld]下面
修改配置文件後,需要重啟mysql:
/opt/lampp/lampp stopmysql
/opt/lampp/lampp startmysql
max_connections=1000#mysql的最大連接數
wait_timeout=10 超時時間
show status like ‘%Threads_connected%‘;查看當前連接數
show processlist;#查看當前連接數
3、緩存
queryCache(Mysql層):
①數據有變化的時候,緩存就失效了
②select語句必須一模一樣才能走緩存,只要有一點不一樣就不會走
③任何一個包含不確定的函數(比如now(),current_date())的查詢不會被緩存
開啟qcache:
在mysql配置文件中添加,linux下為my.cnf,windows下為my.ini
在配置文件的[mysqld]下面
query_cache_type = on#開啟緩存
query_cache_size = 10M #總大小
query_cache_limit = 1M #select查詢結果超過設置值,就不會被緩存
SHOW VARIABLES LIKE ‘%query_cache%‘;查看queryCache狀態
開啟profile:
set @@profiling=1;#設置profile開啟
select @@profiling;#查看profile是否被開啟
show profiles;#查看所有的profile
show profile for query n;查看指定的sql語句
queryCache使用狀態:
SHOW STATUS LIKE ‘Qcache%‘;#使用狀態監控
Qcache_free_memory Query Cache 中目前剩余的內存大小
Qcache_hits 緩存命中次數
Qcache_inserts 多少次未命中然後插入
Query Cache 命中率= Qcache_hits / ( Qcache_hits + Qcache_inserts );
Qcache_free_blocks Query Cache中目前還有多少剩余的blocks。如果該值顯示較大,則說明Query Cache 中的內存碎片較多了,可能需要尋找合適的機會進行整理。
如果這個值非常大,可以使用FLUSH QUERY CACHE;語句來清理查詢緩存碎片以提高內存使用性能。該語句不從緩存中移出任何查詢。
4、存儲引擎
Innodb 存儲引擎
支持外鍵、支持事物,行級鎖,innodb
MyISAM
MyISAM表不支持事務
MyISAM表不支持外鍵(Foreign Key)。
Innodb是行級鎖,myisam是表鎖
開啟innodb_buffer_pool
在配置文件的[mysqld]下面
innodb_buffer_pool_size=20M #設置bufferpool大小
innodb_buffer_pool_dump_now=on#默認為關閉OFF。如果開啟該參數,停止MySQL服務時,InnoDB將InnoDB緩沖池中的熱數據保存到本地硬盤。
innodb_buffer_pool_load_at_startup = off#默認為關閉OFF 。如果開啟該參數,停止MySQL服務時,InnoDB將InnoDB緩沖池中的熱數據保存到本地硬盤。
SHOW VARIABLES LIKE ‘%innodb_buffer_pool%‘;#查看是否配置了innodb_buffer_pool
#查看bp的設置
SHOW STATUS LIKE ‘%Innodb_buffer_pool%‘;
查詢Innodb_buffer_pool當前使用情況:
innodb_buffer_pool_bytes_data 已經使用了多少
innodb_buffer_pool_read_requests 總共查詢bp的次數
innodb_buffer_pool_reads 從物理磁盤中獲取到數據的次數
5、MySql復制
偶發性延時的話,控制寫入速度:
主:只負責寫數據
從:只負責讀數據
頻發性延時:
拆分數據庫實現多點寫入
把數據分散到不同的數據庫上
6、慢查詢
SHOW VARIABLES LIKE ‘%query%‘;#查詢慢查詢日誌是否開啟
set global slow_query_log=on;#開啟慢查詢日誌
set global long_query_time=1;#設置記錄查詢超過多長時間的sql
set global slow_query_log_file=‘/opt/data/slow_query.log‘;#設置mysql慢查詢日誌路徑,此路徑需要有寫權限
mysqldumpslow(可以解析日誌中查詢速度慢的sql語句)命令參數如下:
-s,是表示按照何種方式排序,c、t、l、r分別是按照記錄次數、時間、查詢時間、返回的記錄數來排序,ac、at、al、ar,表示相應的倒敘;
-t,是top n的意思,即為返回前面多少條的數據;
-g,後邊可以寫一個正則匹配模式,大小寫不敏感的
例子:#比如說要按照sql執行時間最長的前20條sql
mysqldumpslow -s t -t 20 -g ‘select‘ /opt/data/slowquery_2016050921.log
通過慢查詢日誌,就可以找到執行效率不高的sql
7、explain/desc
該命令是查看查詢優化器如何決定執行查詢的主要方法
簡單說明:
①id:如果相同,可以認為是一組,從上往下順序執行;在所有組中,id值越大,優先級越高,越先執行;
②select_type有3中值:
simple 它表示簡單的select,沒有union和子查詢.
primary 最外面的select,在有子查詢的語句中,最外面的select查詢就是primary
DERIVED 值表示包含在FROM字句的子查詢中的SELECT,MySQL會遞歸執行並將結果放到一個臨時表中。服務器內部稱其“派生表”,因為該臨時表是從子查詢中派生來的
③type列:指MySQL的訪問類型,也就是如何查找表中的記錄,下面是最重要的訪問方法,依次從最差到最優:
all<index<range<ref<eq_ref<const,system<null
Explain能做什麽?
查看sql的執行效率,幫助我們分析 select 語句,讓我們知道查詢效率低下的原因,從而改進我們的查詢。
8、索引
普通索引:所有列都可以添加索引
create index ‘my_index‘ on bkl(name);
alter table blk add index my_index2 (sex);
#上面這兩種方式都是添加普通索引
alter table blk add index my_index3 (sex,name);#添加組合索引
alter table blk add unique index my_index4 (phone);#添加唯一索引
create unique index ‘my_index5‘ on bkl(phone);
#添加唯一索引
添加主鍵索引:
alter table blk modify id int primary key;
刪除索引:
alter table blk drop index my_index2;
唯一索引:unique
主鍵索引:primary ky
組合索引、多列索引
索引的優化:
①最適合索引的列是出現在WHERE 子句中的列,或連接子句中指定的列
②對於惟一值的列,索引的效果最好,而具有多個重復值的列,其索引效果最差
③不要過度索引,根據業務需要、系統模塊實現來使用索引
9、鎖
MyISAM存儲引擎,其鎖是表鎖。並發情況下的讀沒有問題,但是並發寫入性能比較差。
InnoDB存儲引擎是通過對索引上的索引項加鎖來實現行鎖。這種特點也就意味著,只有通過索引條件檢索數據,InnoDB才使用行級鎖,否則,InnoDB將使用表鎖。
查看死鎖:
show processlist;
show engine innodb status;#一般日誌裏有dblock、lock等字樣
引發死鎖的原因一般是多少線程並發,lock的對象僅在對應表sql commit或者rollback後釋放
可以根據MySQL的加鎖規則,定位出線上產生死鎖的原因
關閉自動提交:
set @@autocommit=0;
查看自動提交是否關閉:
select @@autocommit;
10、事務
事務是訪問並可能更新數據庫中各種數據項的一個程序執行單元。事事務由事務開始(begin transaction)和事務結束(end transaction)之間執行的全體操作組成。
例如:在關系數據庫中,一個事務可以是一條SQL語句,一組SQL語句或整個程序。
事務的四個特性:
原子性(atomicity)
一致性(consistency)
隔離性(isolation)
持久性(durability)
11、SQL的優化
目標:減少IO次數,降低CPU計算
①盡量減少查詢的模糊匹配
②不要在建立的索引的數據列上進行下列操作
避免對索引字段進行計算操作
避免在索引字段上使用not,<>,!=
避免在索引列上使用IS NULL和IS NOT NULL
避免在索引列上出現數據類型轉換
避免在索引字段上使用函數
避免建立索引的列中使用空值。
③盡量減少排序
通過利用索引來排序的方式進行優化
減少參與排序的記錄條數
非必要不對數據進行排序
③盡量避免select *
Select * 一般都會造成全表掃描,顯示所有列,select 需要的字段即可
④盡量用 join 代替子查詢
⑤盡量用 union all 代替 union
⑥避免類型轉換
⑦避免在WHERE子句中使用in,not in,or 或者having
12、監控工具
Spotlight on mysql:可以監控到mysql的io、qcache、連接數、buffer pool等等,還有預警的功能
Lepus:一個開源的國產監控平臺,可以監控到mysql的慢查詢、 qcache、連接數、buffer pool等等,可以同時監控多臺
Zabbix:也是一個開源的監控平臺,和lepus類似,配置比較復雜
MySql:監控及優化