Mariadb扫描时间戳列中的所有分区

问题描述 投票:0回答:1

我有一个表,按以下分区:

HASH(timestamp DIV 43200 )

当我执行此查询时

SELECT max(id) 
  FROM messages 
 WHERE timestamp BETWEEN 1581708508 AND 1581708807

它扫描所有分区,而它们之间的数字15817085081581708807&都在同一个分区中,如何使它仅扫描该分区?

sql hash mariadb partitioning
1个回答
0
投票

您可以使用模块化算术确定单个分区

MOD(<formula which's argument of hash function>,<number of partitions>)

假设您有2个分区

CREATE TABLE messages(ID int, timestamp int)
PARTITION BY HASH( timestamp DIV 43200 )
PARTITIONS 2;

查找分区名称依据

SELECT CONCAT( 'p',MOD(timestamp DIV 43200,2)) AS partition_name, timestamp 
  FROM messages;

并确定时间戳列的值1581708508的相关分区名称(假定p1)。然后使用

SELECT MAX(id) 
  FROM messages PARTITION(p1)

仅获得分区p1中的所有记录,而无需WHERE条件,例如

WHERE timestamp BETWEEN 1581708508 AND 1581708807

顺便说一句,所有分区都可以通过]列出。

SELECT * 
  FROM INFORMATION_SCHEMA.PARTITIONS 
 WHERE table_name='messages'

Demo

© www.soinside.com 2019 - 2024. All rights reserved.