Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用的整数上使用算术元素(加法)进行SQL范围分区-它会优化WHERE查询吗?(MySQL、PostgreSQL)_Mysql_Postgresql_Optimization_Partitioning_Slice - Fatal编程技术网

在使用的整数上使用算术元素(加法)进行SQL范围分区-它会优化WHERE查询吗?(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'), )

我读过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'),
);
将使查询变得像:

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