1. 程式人生 > >MySQL通過添加索引解決線上數據庫服務器壓力大問題

MySQL通過添加索引解決線上數據庫服務器壓力大問題

索引 MySQL 監控 無法登陸無法打開網頁

昨天線上應用反饋晚上 19:30-19:43以及 20:13到20:21兩個時間段所有人包括我們自己建的教室都進不去,

classroom B套無法登陸,主頁無法訪問,已有超過10個老師和學生反饋進不去教室的問題

通過監控查看出現問題時數據庫服務器的cpu使用率,負載,io,內存使用,swap剩余量等狀況,發現數據庫當時壓力特別大,

技術分享圖片

數據庫連接數:


數據庫慢查詢也出現很多

查看慢查詢日誌,發現一個SQL在慢查詢日誌中頻繁出現切執行時間較長

# User@Host: cms[cms] @  [172.17.43.24]
# Query_time: 10.252490  Lock_time: 0.000052 Rows_sent: 1  Rows_examined: 2345869
SET timestamp=1522065887;
select participan0_.id as id19_, participan0_.conferenceid as conferen2_19_, participan0_.name as name19_, participan0_.phone as phone19_, participan0_
.pin as pin19_, participan0_.email as email19_, participan0_.mobile as mobile19_, participan0_.valid as valid19_, participan0_.userdefine1 as userdefin
e9_19_, participan0_.userdefine2 as userdefine10_19_, participan0_.userdefine3 as userdefine11_19_, participan0_.userdefine4 as userdefine12_19_ from p
articipant participan0_ where (participan0_.conferenceid=2680447 )and(participan0_.pin='1219' );
# User@Host: cms[cms] @  [172.17.43.25]
# Query_time: 10.297055  Lock_time: 0.000050 Rows_sent: 1  Rows_examined: 2345869
SET timestamp=1522065887;
select participan0_.id as id19_, participan0_.conferenceid as conferen2_19_, participan0_.name as name19_, participan0_.phone as phone19_, participan0_
.pin as pin19_, participan0_.email as email19_, participan0_.mobile as mobile19_, participan0_.valid as valid19_, participan0_.userdefine1 as userdefin
e9_19_, participan0_.userdefine2 as userdefine10_19_, participan0_.userdefine3 as userdefine11_19_, participan0_.userdefine4 as userdefine12_19_ from p
articipant participan0_ where (participan0_.conferenceid=2697493 )and(participan0_.pin='1492' );
# User@Host: cms[cms] @  [172.17.43.25]
# Query_time: 10.319839  Lock_time: 0.000048 Rows_sent: 1  Rows_examined: 2345869
SET timestamp=1522065887;
select participan0_.id as id19_, participan0_.conferenceid as conferen2_19_, participan0_.name as name19_, participan0_.phone as phone19_, participan0_
.pin as pin19_, participan0_.email as email19_, participan0_.mobile as mobile19_, participan0_.valid as valid19_, participan0_.userdefine1 as userdefin
e9_19_, participan0_.userdefine2 as userdefine10_19_, participan0_.userdefine3 as userdefine11_19_, participan0_.userdefine4 as userdefine12_19_ from p
articipant participan0_ where (participan0_.conferenceid=2680355 )and(participan0_.pin='9590' );
# User@Host: cms[cms] @  [172.17.43.24]
# Query_time: 10.163372  Lock_time: 0.000063 Rows_sent: 1  Rows_examined: 2345872
SET timestamp=1522065887;
select participan0_.id as id19_, participan0_.conferenceid as conferen2_19_, participan0_.name as name19_, participan0_.phone as phone19_, participan0_
.pin as pin19_, participan0_.email as email19_, participan0_.mobile as mobile19_, participan0_.valid as valid19_, participan0_.userdefine1 as userdefin
e9_19_, participan0_.userdefine2 as userdefine10_19_, participan0_.userdefine3 as userdefine11_19_, participan0_.userdefine4 as userdefine12_19_ from p
articipant participan0_ where (participan0_.conferenceid=2731041 )and(participan0_.pin='1506' );
# User@Host: cms[cms] @  [172.17.43.24]
# Query_time: 9.950549  Lock_time: 0.000073 Rows_sent: 1  Rows_examined: 2345881
SET timestamp=1522065887;
select participan0_.id as id19_, participan0_.conferenceid as conferen2_19_, participan0_.name as name19_, participan0_.phone as phone19_, participan0_
.pin as pin19_, participan0_.email as email19_, participan0_.mobile as mobile19_, participan0_.valid as valid19_, participan0_.userdefine1 as userdefin
e9_19_, participan0_.userdefine2 as userdefine10_19_, participan0_.userdefine3 as userdefine11_19_, participan0_.userdefine4 as userdefine12_19_ from p
articipant participan0_ where (participan0_.conferenceid=2682013 )and(participan0_.pin='6086' );
# User@Host: cms[cms] @  [172.17.43.25]
# Query_time: 9.992145  Lock_time: 0.000051 Rows_sent: 1  Rows_examined: 2345879
SET timestamp=1522065887;
select participan0_.id as id19_, participan0_.conferenceid as conferen2_19_, participan0_.name as name19_, participan0_.phone as phone19_, participan0_
.pin as pin19_, participan0_.email as email19_, participan0_.mobile as mobile19_, participan0_.valid as valid19_, participan0_.userdefine1 as userdefin
e9_19_, participan0_.userdefine2 as userdefine10_19_, participan0_.userdefine3 as userdefine11_19_, participan0_.userdefine4 as userdefine12_19_ from p
articipant participan0_ where (participan0_.conferenceid=2697493 )and(participan0_.pin='1103' );


查看該SQL的執行計劃發現走了全表掃描,掃描了200多萬行的數據;

mysql> explain select participan0_.id as id19_, participan0_.conferenceid as conferen2_19_, participan0_.name as name19_, participan0_.phone as phone19_,
 participan0_.pin as pin19_, participan0_.email as email19_, participan0_.mobile as mobile19_, participan0_.valid as valid19_, 
 participan0_.userdefine1 as userdefine9_19_, participan0_.userdefine2 as userdefine10_19_, participan0_.userdefine3 as userdefine11_19_,
 participan0_.userdefine4 as userdefine12_19_ from participant participan0_ where (participan0_.conferenceid=2724963 )and(participan0_.pin='5476' );
+----+-------------+--------------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table        | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
+----+-------------+--------------+------+---------------+------+---------+------+---------+-------------+
|  1 | SIMPLE      | participan0_ | ALL  | NULL          | NULL | NULL    | NULL | 2042005 | Using where |
+----+-------------+--------------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.02 sec)


發現該表where條件的列上沒有索引:

mysql> show index from participant;
+-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table       | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| participant |          0 | PRIMARY  |            1 | id          | A         |     2384122 |     NULL | NULL   |      | BTREE      |         |               |
+-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)

和發開溝通後在該表上加上以下索引:

mysql> ALTER  TABLE  `participant`  ADD  INDEX index_conferenceid (`conferenceid`); 
Query OK, 0 rows affected (9.16 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER  TABLE  `participant`  ADD  INDEX index_pin (`pin`);
Query OK, 0 rows affected (6.96 sec)
Records: 0  Duplicates: 0  Warnings: 0

再次查看該SQL的執行計劃:

mysql>  explain select participan0_.id as id19_, participan0_.conferenceid as conferen2_19_, participan0_.name as name19_, participan0_.phone as phone19_, participan0_.pin as pin19_, participan0_.email as email19_, participan0_.mobile as mobile19_, participan0_.valid as valid19_, participan0_.userdefine1 as userdefine9_19_, participan0_.userdefine2 as userdefine10_19_, participan0_.userdefine3 as userdefine11_19_, participan0_.userdefine4 as userdefine12_19_ from participant participan0_ where (participan0_.conferenceid=2724963 )and(participan0_.pin='5476' );
+----+-------------+--------------+-------------+------------------------------+------------------------------+---------+------+------+------------------------------------------------------------+
| id | select_type | table        | type        | possible_keys                | key                          | key_len | ref  | rows | Extra                                                      |
+----+-------------+--------------+-------------+------------------------------+------------------------------+---------+------+------+------------------------------------------------------------+
|  1 | SIMPLE      | participan0_ | index_merge | index_conferenceid,index_pin | index_conferenceid,index_pin | 5,7     | NULL |    1 | Using intersect(index_conferenceid,index_pin); Using where |
+----+-------------+--------------+-------------+------------------------------+------------------------------+---------+------+------+------------------------------------------------------------+
1 row in set (0.01 sec)



-----------------------------我是分割線-----------------------

等到晚上約課較多的時間再次觀察數據庫的負載和慢查詢日誌

MySQL通過添加索引解決線上數據庫服務器壓力大問題