I'm having a tough time deciding whether or not to partition my table based on a unix timestamp or by a descriptor attribute. It's just over a billion rows currently.
My table basically contains:
BIGINT id
DOUBLE value
SMALLINT device_id
BIGINT unixtime
- (and others…)
I can either choose to partition it based on the device_id
or some modulus value on the unixtime
field. On all of the examples I've seen on partitioning, everybody seems to do it on a timestamp field.
Right now, I'm constantly doing searches based on the device_id
and a range of unixtime
values: a user chooses a device, then picks out a time frame that they want to view (most of the time, it's the past 24 hours).
Would it even make sense to partition it based on the device_id
column? Or would using the unixtime
field be the way to go?
Best Answer
By all means, partition by unixtime. Why ???
ALTER TABLE tbalename DROP PARTITION partitionname
) instead of DML (DELETE FROM tablename WHERE unixtime ...
). See my answer to this post Partitioning and freeing disk spaceHere is what I am going to do for you
Let say your table is as you gave as an example
Please note that
unixtime
must be part of thePRIMARY KEY
.unixtime
should beINT UNSIGNED
instead ofBIGINT
This will make your table 30 days back and 10 days ahead. Of course, those extra 10 days should be empty all the time.
If you run the following code, this will create the stored procedures and events that will run every night
The events will do the following:
Append_Daily_Partitions
will add new partition at 11:45 PMRotate_Daily_Partitions
will delete old partition at 12:15 AMPlease install this on a Dev or Staging Server and verify to works for you.
GIVE IT A TRY !!!