programing

mariadb 파티션이 더 나은 성능을 제공하지 못하는 이유는 무엇입니까?

prostudy 2022. 9. 9. 08:57
반응형

mariadb 파티션이 더 나은 성능을 제공하지 못하는 이유는 무엇입니까?

인사.

먼저 테이블 구성을 보여 줍니다.

CREATE TABLE `log_table` (
`rid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`dataId` int(10) unsigned NOT NULL DEFAULT '0',
`memberId` int(10) unsigned NOT NULL DEFAULT '0',
`clientId` int(10) unsigned NOT NULL DEFAULT '0',
`qty` int(11) NOT NULL DEFAULT '0',
`timestamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`typeA` tinyint(2) DEFAULT NULL,
`typeB` int(11) DEFAULT '0',
PRIMARY KEY (`rid`,`timestamp`),
KEY `idx_report1` (`timestamp`,`memberId`,`dataId`),
KEY `idx_report2` (`memberId`,`timestamp`),
KEY `idx_report3` (`dataId`,`timestamp`,`rid`),
KEY `idx_report4` (`timestamp`,`typeB`,`typeA`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE (year(`timestamp`))
(PARTITION p2014 VALUES LESS THAN (2015),
 PARTITION p2015 VALUES LESS THAN (2016)
);

저는 MariaDB 5.5를 사용하고 있으며 이 테이블에는 2500만 개의 레코드가 포함되어 있기 때문에 가까운 장래에 성능 문제가 발생하지 않도록 테이블에 파티션을 만들기로 했습니다.시계열, 로그 데이터 및 4개의 보기를 볼 수 있습니다.예를 들어, 보기 중 하나는 다음 쿼리를 사용합니다.

select typeB, typeA, count(*) as number from log_table where timestamp between '2015-1-1' and '2015-2-1' group by typeB, typeA;

AFIK, 이 쿼리는 파티션 프루닝을 통해서만 p2015에서 데이터를 로드합니다.그러나 쿼리 실행 시간은 원본 테이블과 파티션 버전 간에 큰 차이가 없다는 것을 알게 되었습니다.(평균 1.94초 대 1.95초)

음, 각 파티션의 행 수에 따라 영향을 받는다고 생각했어요.그럼 작은 사이즈의 파티션은 어때요?to_days()?

PARTITION BY RANGE (to_days(`timestamp`))
(
...
PARTITION p_2015_01 VALUES LESS THAN (to_days('2015-2-1')),
PARTITION p_2015_02 VALUES LESS THAN (to_days('2015-3-1'))
...
)

음, 효과가 없어요제 잃어버린 조각이 무엇인지 알려주시겠어요?


EDIT: 쿼리에서 오류가 발생하여 죄송합니다.그런데 파티션 설명으로는 도움이 안 돼요.

두 표를 모두 설명한 결과는 다음과 같습니다.

// original
+------+-------------+-----------+-------+-------------------------+-------------+---------+------+---------+-----------------------------------------------------------+
| id   | select_type | table     | type  | possible_keys           | key         | key_len | ref  | rows    | Extra                                                     |
+------+-------------+-----------+-------+-------------------------+-------------+---------+------+---------+-----------------------------------------------------------+
|    1 | SIMPLE      | org_table | range | idx_report1,idx_report4 | idx_report4 | 8       | NULL | 8828000 | Using where; Using index; Using temporary; Using filesort |
+------+-------------+-----------+-------+-------------------------+-------------+---------+------+---------+-----------------------------------------------------------+


//partition
+------+-------------+-----------+-------+-------------------------+-------------+---------+------+---------+-----------------------------------------------------------+
| id   | select_type | table     | type  | possible_keys           | key         | key_len | ref  | rows    | Extra                                                     |
+------+-------------+-----------+-------+-------------------------+-------------+---------+------+---------+-----------------------------------------------------------+
|    1 | SIMPLE      | log_table | range | idx_report1,idx_report4 | idx_report4 | 8       | NULL | 7902646 | Using where; Using index; Using temporary; Using filesort |
+------+-------------+-----------+-------+-------------------------+-------------+---------+------+---------+-----------------------------------------------------------+

PARTITIONing사용자가 생각하는 것만큼 퍼포먼스에 도움이 되지 않습니다.

KEY `idx_report4` (`timestamp`,`typeB`,`typeA`)

하지 않는 것이 입니다.SELECT공했습습니니다PARTITIONing을 사용하다

★★BETWEEN' '아까'입니다.where timestamp between '2015-1-1' and '2015-2-1'실제로 두 개의 파티션에 도달합니다.EXPLAIN PARTITIONS SELECT ...그걸 보려고요.

BY RANGE (TO_DAYS(...)) 더 것이다BY RANGE (YEAR(...))query.에는 이 되지 않습니다.

여기에서는, 다음의 4개의 사용 사례에 대해 설명합니다.PARTITIONing퍼포먼스 향상:http://mysql.rjweb.org/doc.php/partitionmaint

이러한 유형의 쿼리가 중요한 경우 응용 프로그램 속도를 크게 높이는 방법으로서 "요약표"를 고려하십시오.http://mysql.rjweb.org/doc.php/datawarehouse 및 http://mysql.rjweb.org/doc.php/summarytables

언급URL : https://stackoverflow.com/questions/33361363/why-mariadb-partitioning-doesnt-give-me-better-performance

반응형