为什么mariadb分区并没有给我带来更好的性能?

时间:2015-10-27 06:38:01

标签: mysql mariadb

问候语。

让我首先展示我的餐桌计划:

case 1:
bool read = (33 & 3) ; //No Warning issued by vs 2013

case 2:
int b = 33;
bool read = (b & 3) ; //Now compiler is generating C4800 warning.  

我使用MariaDB 5.5并且此表包含2500万条记录,因此我决定在表中创建分区,以防止在不久的将来出现性能问题。 您可能会看到它的时间序列,日志数据以及4个视图。例如,其中一个视图使用以下查询:

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)
);

AFAIK,此查询仅通过分区修剪从p2015加载数据。但我看到原始表和分区版本在查询执行时间上没有太大区别。 (平均1.94秒vs 1.95秒)

嗯,我认为它可能会受到每个分区中行数的影响。然后如何更小的分区? TO_DAYS()?

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

嗯,没有效果。你能让我知道我遗失的是什么吗?

编辑:对不起我在查询中的错误..顺便说一下,EXPLAIN PARTITION不帮助我。

和两个表的解释结果是:

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'))
...
)

1 个答案:

答案 0 :(得分:1)

UINavigationController *frontNavigationController = (id)revealController.frontViewController; if ([frontNavigationController.topViewController isKindOfClass:[YourViewController class]] ) viewwaboutus=[[FlashViewController alloc]init]; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewwaboutus]; [revealController pushFrontViewController:navigationController animated:YES]; } 几乎没有像用户那样频繁地提高性能。

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(...))更好,但对于给定的查询仍无效。

以下是我对 4个用例的讨论,其中BY RANGE (YEAR(...))有助于提升绩效:http://mysql.rjweb.org/doc.php/partitionmaint

如果此类查询很重要,请考虑使用“摘要表”作为大大加快应用程序速度的方法:http://mysql.rjweb.org/doc.php/datawarehousehttp://mysql.rjweb.org/doc.php/summarytables