我有一个表,按以下分区:
HASH(timestamp DIV 43200 )
当我执行此查询时
SELECT max(id)
FROM messages
WHERE timestamp BETWEEN 1581708508 AND 1581708807
它扫描所有分区,而它们之间的数字1581708508
和1581708807
&都在同一个分区中,如何使它仅扫描该分区?
您可以使用模块化算术确定单个分区
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'