1. 程式人生 > >MySql:監控及優化

MySql:監控及優化

外鍵 更新 控制 指定 復雜 性能比較 多臺 roo 組成

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:監控及優化