分区被SELECT忽略吗?

时间:2020-01-28 15:45:40

标签: mysql sql date partitioning

我已经在YEAR('datetimestamp')上使用HASH方法对一个巨大的数据表进行了分区,共有30个分区。

但是,当我查询类似的内容时,我注意到结果比以前慢,而不是更快

SELECT * FROM 'mytable' WHERE user_id=100 AND YEAR(datetimestamp) = 2019;

使用EXPLAIN FORMAT = JSON显示实际上似乎在考虑30个分区,而不仅仅是获得正确的分区。

我做错了什么?

PS-通过不进行分区,而改用(user_id和datetimestamp)添加新的INDEX键,可以获得更好的性能。我担心的是,在几年之内,它的大小是如此之大,以至于拥有分区确实可以减少查询时间。

1 个答案:

答案 0 :(得分:2)

简而言之,PARTITION BY HASH没有任何性能上的好处。或我发现的任何其他好处。而且,正如您所发现的,HASH倾向于查看所有分区。

那么,该怎么做呢?为此:

SELECT * FROM `mytable`
    WHERE user_id = 100
      AND YEAR(datetimestamp) = 2019;

做:

  • 无分区;
  • YEAR测试更改为

    AND datetimestamp >= '2019-01-01'
    AND datetimestamp  < '2019-01-01' + INTERVAL 1 YEAR
    
  • INDEX(user_id, datetimestamp)
    

那样,它将对索引进行简单的范围扫描。

YEAR(...)不可“更改”,但我上面的表述是。