DB & AWS Knowledge
Explain for connection 기능과 제한 사항 본문
이 페이지에서는 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 유저를 사용하면 실행 계획을 확인 할 수 있다.
'MySQL > 기타 지식' 카테고리의 다른 글
MySQL, MariaDB 의 signal crash (0) | 2024.01.11 |
---|---|
MySQL, MariaDB 내 lower_case_table_names 사용 시 주의 사항 (0) | 2023.09.17 |
MySQL및 MariaDB 에서의 max_open_files 및 open_files_limit 의 의의와 AWS RDS, Aurora Cluster 의 제한 사항 (0) | 2023.03.15 |
Auto_Increment 개념 및 버전에 따른 주의 사항 (0) | 2023.02.21 |
MySQL / MariaDB Replication -Slave 서버 데이터 기입 (0) | 2021.07.09 |