Today
Total
KoreanEnglishFrenchGermanJapaneseSpanishChinese (Simplified)
관리 메뉴

DB & AWS Knowledge

Explain for connection 기능과 제한 사항 본문

MySQL/기타 지식

Explain for connection 기능과 제한 사항

`O` 2023. 7. 6. 03:00
728x90
반응형

이 페이지에서는 MySQL 5.7 부터 지원되는 Explain for connection 기능과 제한사항에 대해서 다룬다.

 

해당 내용은 아래의 URL 들을 참조한다.

 

[1] https://dev.mysql.com/doc/refman/8.0/en/explain.html

 

[2] https://bugs.mysql.com/bug.php?id=100003 

 

[3] https://bugs.mysql.com/bug.php?id=107314 

 

 

Explain for connection 기능의 의의

 

Explain for connection 은 현재 수행되는 쿼리의 실행계획을 바로 알 수 있는 명령어다.

아래와 같이 테스트를 수행 해 볼 수 있다.

 

[Test]

- Session 1 

mysql> select sleep(1100);

- Session 2

mysql> show processlist;
+--------+-----------------+---------------------+------+---------+---------+--------------------------------------------------------+--------------------+
| Id     | User            | Host                | db   | Command | Time    | State                                                  | Info               |
+--------+-----------------+---------------------+------+---------+---------+--------------------------------------------------------+--------------------+
|      5 | event_scheduler | localhost             | NULL | Daemon  | 1370020 | Waiting on empty queue                                 | NULL               |
|     13 | system user     | connecting host     | NULL | Connect | 1370018 | Connecting to master                                   | NULL               |
|     14 | system user     |                     | NULL | Query   |     275 | Slave has read all relay log; waiting for more updates | NULL               |
|  76315 | rdsadmin        | localhost             | NULL | Sleep   |       0 |                                                        | NULL               |
|  76316 | rdsadmin        | localhost             | NULL | Sleep   |       1 |                                                        | NULL               |
|  76321 | rdsadmin        | localhost             | NULL | Sleep   |      38 |                                                        | NULL               |
|  76323 | rdsadmin        | localhost             | NULL | Sleep   |       7 |                                                        | NULL               |
| 118740 | rdsadmin        | localhost             | NULL | Sleep   |       2 |                                                        | NULL               |
| 118749 | admin           | 172.31.19.176:37052 | NULL | Query   |     152 | User sleep                                             | select sleep(1100) |
| 118751 | admin           | 172.31.19.176:37060 | NULL | Query   |       0 | init                                                   | show processlist   |
+--------+-----------------+---------------------+------+---------+---------+--------------------------------------------------------+--------------------+
10 rows in set (0.00 sec)

mysql>  explain for connection 118749;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra          |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
|  1 | SIMPLE      | NULL  | NULL       | NULL | NULL          | NULL | NULL    | NULL | NULL |     NULL | No tables used |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
1 row in set (0.01 sec)

 

이와 같이 갑작스럽게 특정 세션의 DB 부하가 증가하거나 내용이 긴 쿼리에 대해서 수행계획을 빨리 찾아야 할 시, 유용하게 사용 할 수 있다. 

 

 

Explain for connection 기능의 제한사항

 

다만 이 기능은 아래와 같은 제한사항이 있다.

 

-  이 명령어로 분석 할 수 있는 쿼리형태는 SELECT/UPDATE/INSERT/DELETE/REPLACE 로만 제한 되어있다.

또한 프로시저 및  prepared statements 등의 복합 구문에도 사용 할 수 없다.

 

ERROR 1889 (HY000): EXPLAIN FOR CONNECTION command is supported only for SELECT/UPDATE/INSERT/DELETE/REPLACE

 

- AWS 등의 cloud 환경에서는 다른 유저간에 수행되는 쿼리를 분석 시, 이 명령어 자체를 쓸 수 없다.

이는 현재 MySQL engine 에 있는 bug 와 연관되어 있는 사항이 있기 때문이다.

 

[2] 에 있는 bug report 와 같이, 현재 해당 명령어는 공식 MySQL Document 에 따라 Process 권한만 있으면 수행 될 수 있는 걸로 기재 된 것과 달리, 내부적으로 super user 권한을 추가로 요구하는 이슈가 있다. 

 

클라우드 환경에서는 사용자들이 super user 권한을 사용 할 수 없기에 결국 다른 유저들간에 process 권한이 있어도 아래와 같은 error 를 확인하게 된다.

 

ERROR 1045 (28000): Access denied for user 'admin'@'%' (using password: YES)

 

현재, 이는 bug 성 이슈이기 때문에 AWS 에서 사용자가 자체적으로 쓸 수 있는 프로시저를 만들기 어려울 것으로 보인다.

다만, 위의 예시와 같이 다른 세션간에도 동일한 admin 유저를 사용하면 실행 계획을 확인 할 수 있다.

반응형
Comments