在使用的整数上使用算术元素(加法)进行SQL范围分区-它会优化WHERE查询吗?(MySQL、PostgreSQL)
我读过MySQL(和PostgreSQL)中的范围分区。我也知道,如果我对我的表进行分区,一些查询将得到优化 例如,按日期使用的分区:在使用的整数上使用算术元素(加法)进行SQL范围分区-它会优化WHERE查询吗?(MySQL、PostgreSQL),mysql,postgresql,optimization,partitioning,slice,Mysql,Postgresql,Optimization,Partitioning,Slice,我读过MySQL(和PostgreSQL)中的范围分区。我也知道,如果我对我的表进行分区,一些查询将得到优化 例如,按日期使用的分区: PARTITION BY RANGE (used_at) ( PARTITION p0 VALUES LESS THAN ('2012-01-01'), PARTITION p1 VALUES LESS THAN ('2013-01-01'), PARTITION p2 VALUES LESS THAN ('2014-01-01'), )
PARTITION BY RANGE (used_at) (
PARTITION p0 VALUES LESS THAN ('2012-01-01'),
PARTITION p1 VALUES LESS THAN ('2013-01-01'),
PARTITION p2 VALUES LESS THAN ('2014-01-01'),
);
将使查询变得像:
WHERE used_at >= '2013-05-01' AND used_at < '2013-09-01'
我们得到的线程如下:
WHERE ... (sender = 1234567 OR recipient = 1234567)
...
GROUP BY (sender + recipient)
我的问题是:
a) 我能用计算机分割吗
PARTITION BY RANGE (sender + recipient) (
PARTITION p0 VALUES LESS THAN (1000000),
PARTITION p1 VALUES LESS THAN (2000000),
...
PARTITION p5 VALUES LESS THAN (6000000),
);
?
b) 如果是,它会在以下条件下进行优化:
WHERE ... (sender = 1234567 OR recipient = 1234567)
如果是无符号整数
这个问题基本上是关于MySQL的,但我也对未来的PostgreSQL和Oracle感到好奇。MySQL
WHERE ... (sender = 1234567 OR recipient = 1234567)
没有很好地优化。这样做会更好
( SELECT ... WHERE sender = 1234567 )
UNION DISTINCT
( SELECT ... WHERE recipient = 1234567 )
并且对发送者和接收者有单独的索引(或者至少从每个索引开始)
分区可以处理很少的表达式,不包括(x+y)
无法通过任何形式的索引或分区进行优化。它将涉及一次完整扫描,可能还包括一次文件排序
如果您是指按发件人、收件人分组,那就另当别论了
WHERE used_at >= '2013-05-01' AND used_at < '2013-09-01'
想要的索引(x,用于)
使用地点>='2013-05-01'和使用地点<'2013-09-01'
x>1
有问题——两个范围。在本例中,按范围
在处使用的x
或分区将是有益的。这是因为:首先“分区修剪”将首先选择所需的分区,然后普通索引(如果有)将接管以完成任务。(如果没有关于表格和数据分布的进一步细节,就不可能说出最佳索引是什么。)
关于用户
加消息
执行计划是怎么说的?我只能稍后再尝试,因为我需要先在本地副本中植入数据(在我将在没有分区的情况下进行基准测试之前),但是的,这可以解释一切,我只是想知道它是否值得关注。为了说明这一点,我甚至不知道是否接受按范围分区(发送方+接收方)。MySQL的partitionbyrange
接受表达式&PostgreSQL的分区技术基于CHECK
constratints,它也接受任何(按行)表达式,所以您可以这样做。但是我不清楚,为什么要这样做(在sender+recipient
上进行分区)?这是主键上的算术表达式(从技术上讲是外键,外键是引用表上的主键)。此外,它仅在您查询sender+recipient
时对您有帮助,而在sender=?或收件人=?
“如果您是针对发件人+收件人进行查询,但不是针对发件人=?或收件人”POZ,这实际上回答了问题,如果它是真的。所以非常感谢:)谢谢,这实际上是所有问题的正确答案,但由于这是一篇老文章,从那时起,事实证明,在MySQL中,外键和分区不能一起工作。(顺便说一下,我的意思是“发件人+收件人”是“发件人+收件人”,谢谢你告诉我这行不通)
GROUP BY (sender + recipient)
WHERE used_at >= '2013-05-01' AND used_at < '2013-09-01'
WHERE used_at >= '2013-05-01' AND used_at < '2013-09-01'
AND x = 1
WHERE used_at >= '2013-05-01' AND used_at < '2013-09-01'
AND x > 1