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
'programing' 카테고리의 다른 글
업스트림에서 응답 헤더를 읽는 동안 업스트림에서 너무 큰 헤더가 전송되었습니다. (0) | 2022.09.09 |
---|---|
람다 식을 사용하여 요소가 존재하는지 확인하는 방법은 무엇입니까? (0) | 2022.09.09 |
JavaScript에서 옵션 함수 파라미터를 선언하려면 어떻게 해야 합니까? (0) | 2022.09.09 |
에러 코드: 1235.이 버전의 MariaDB는 아직 '창 함수로 카운트(DISTINCT) 집계'를 지원하지 않습니다. (0) | 2022.09.09 |
64비트보다 큰 값을 반환하는 bit_count 함수를 지원하는 mariadb 버전 (0) | 2022.09.09 |