MySQL 8.0.14 CHECK TABLE - Parallel Query Execution - CHECK TABLE 병렬 쿼리 수행

Last Updated on 1월 14, 2021 by 태랑(정현호)



1. 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 과는 다른)


2. 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 절 조건이 없이)


3. Feature Test

innodb_parallel_read_threads 파라미터로 제어하여 사용할 수 있습니다.

3-1 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)

3-2 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)

3-2 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 에 따라 스레드는 조정해서 사용하면 됩니다.


4. 결론

이 기능은 현재로써는 매우 제한적이지만 MySQL 제품 측면에서 보면 병렬 쿼리 기능이 미약하게 나마 시작되었다는 것에 의미가 있다고 생각 합니다



Ref link.
mysql-8-0-14-a-road-to-parallel-query-execution-is-wide-open
dev.mysql.com/check-table.html



연관된 다른 글

 

 

 

 

 

 



 

“MySQL 8.0.14 CHECK TABLE - Parallel Query Execution - CHECK TABLE 병렬 쿼리 수행” 에 대한 2 댓글

답글 남기기