Last Updated on 5월 6, 2024 by Jade(정현호)
MySQL - Parallel Query
MySQL 에서는 예전부터 Native Parallel Query를 실행할 수 있는 기능이 추가되기를 많은 사람들은 희망하였습니다
하지만 오랜 시간동안 기능이 반영되지는 못하였습니다. 아직까지 MySQL은 Parallel 쿼리 기능 지원이 부족한 상태입니다.
그에 따라 다른 형태인 병렬 bash 스크립트에서 Apache Spark 사용하거나 MySQL과 함께 ClickHouse 사용하거나 AWS Aurora Cluster 나 POLARDB for MySQL 에서 별도의 외부 기능을 통해서 여러 노드의 스토리지 엔진을 통하거나 Partition table 을 이용해서 Client 측의 MultiThread 형식으로 처리를 한다던지 하는 외부적인 기능의 기능 추가로 활용하고 있습니다.
(예를 들어 Oracle 과 같이 Native Parallel Query Processing 과는 다른)
New 8.0.14
MySQL 8.0.14 버전 에서 작게나마 Native 병렬 쿼리를 실행할 수 있는 기능이 추가 되었습니다 현재 포스팅 시점에서(MySQL-8.0.14) 는 COUNT(*) 에서 만 제한적으로 사용할 수 있습니다.
MySQL 8.0.14에는 릴리스 노트에 다음과 같은 내용이 포함되어 있습니다.
InnoDB: InnoDB now supports parallel clustered index reads, which can improve CHECK TABLE performance. This feature does not apply to secondary index scans.
The innodb_parallel_read_threads session variable must be set to a value greater than 1 for parallel clustered index reads to occur.
The default value is 4. The actual number of threads used to perform a parallel clustered index read is determined by the innodb_parallel_read_threads setting or the number of index subtrees to scan, whichever is smaller.
8.0.14 버전 부터 CHECK TABLE 기능 사용시 parallel clustered index 읽기를 기능을 지원하기 시작하였습니다
innodb_parallel_read_threads 파라미터를 사용하면 되며, 세션 단위로 설정하여 사용할 수 있으며 1 이상의 설정함에 따라서 parallel clustered index 읽기가 발생되게 됩니다.
innodb_parallel_read_threads 파라미터의 default 값은 4로 설정되어 있습니다.
(즉 8.0.14 이상 버전부터는 CHECK TABLE 기능 사용시 parallel 4로 동작)
추가로 MySQL 8.0.17 부터는 parallel read threads 를 최대 256개 까지 사용이 가능 합니다 모든 클라이언트 연결에 대한 총 스레드 수 이며 스레드 제한에 도달하면 Connection은 단일 스레드를 사용하도록 대체됩니다
CHECK TABLE 에서 동작하는 것을 착안하여 select count(*) from "테이블명" 과 같이 Full Count 일 경우 Parallel Query 사용이 가능 합니다.
(단. where 절 조건이 없이)
그리고 무엇보다 중요한 것은 해당 기능은 PK(Primary Key) 을 통해서만 사용할 수 있다는 것입니다.
병렬 처리에 사용되는 스레드 수는 innodb_parallel_read_threads 에 지정된 값 과 스캔을 하는 index subtrees 수 중에서 작은 값으로 수행이 되게 됩니다.
Feature Test
innodb_parallel_read_threads 파라미터로 제어하여 사용할 수 있습니다.
#Test1 : thread=1
mysql> set session innodb_parallel_read_threads=1;
mysql> select count(*) from tb_test;
+-----------+
| count(*) |
+-----------+
| 34603008 |
+-----------+
1 row in set (5.79 sec)
#Test2 : thread=4
mysql> set session innodb_parallel_read_threads=4;
mysql> select count(*) from tb_test;
+-----------+
| count(*) |
+-----------+
| 34603008 |
+-----------+
1 row in set (1.85 sec)
#Test3 : thread=8
set session innodb_parallel_read_threads=8;
mysql> select count(*) from tb_test;
+-----------+
| count(*) |
+-----------+
| 34603008 |
+-----------+
1 row in set (1.64 sec)
* 테스트 환경(VM) 에서 CPU가 4 라서 8이 사실상 큰 효과가 없었으며 CPU 에 따라 스레드는 조정해서 사용하면 됩니다.
Conclusion
이 기능은 현재로서는 매우 제한적이지만 MySQL 제품 측면에서 보면 병렬 쿼리 기능이 미약하게나마 시작되었다는 것에 의미가 있다고 생각 합니다
업데이트: 8.0.27 에서는 해당 기능을 사용한 "InnoDB Parallel Threads for Online DDL Operations" 가 추가되었습니다.
Reference
Reference URL
• mysql-8-0-14-a-road-to-parallel-query-execution-is-wide-open
• dev.mysql.com/check-table.html
연관된 다른 글
Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io
Excellent blog here! Also your web site loads up fast!
What web host are you using? Can I get your affiliate link to your host?
I wish my website loaded up as quickly as yours lol
Hi
This blog is running on WordPress using Oracle Cloud