我已经在YEAR('datetimestamp')上使用HASH方法对一个巨大的数据表进行了分区,共有30个分区。
但是,当我查询类似的内容时,我注意到结果比以前慢,而不是更快
SELECT * FROM 'mytable' WHERE user_id=100 AND YEAR(datetimestamp) = 2019;
使用EXPLAIN FORMAT = JSON显示实际上似乎在考虑30个分区,而不仅仅是获得正确的分区。
我做错了什么?
PS-通过不进行分区,而改用(user_id和datetimestamp)添加新的INDEX键,可以获得更好的性能。我担心的是,在几年之内,它的大小是如此之大,以至于拥有分区确实可以减少查询时间。
答案 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(...)
不可“更改”,但我上面的表述是。