http://mysql.rjweb.org/doc.php/partitionmaint
создание табл. 13го числа:
CREATE TABLE t
(
date date NOT NULL,
a int(11) NOT NULL,
b int(11) not null,
PRIMARY KEY (a, date),
KEY key_b (b, date)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8
partition by range (to_days(date)) (
partition start values less than (0),
partition p20190512 values less than (to_days('2019-05-13')),
partition p20190513 values less than (to_days('2019-05-14')),
partition p20190514 values less than (to_days('2019-05-15')),
partition future values less than maxvalue
)
;
14-го в 8:00 UTC или позже удаляем партишн за 13-е (или за 12 если надо зрангить день истории) - в это время 13е чилсло заканчивается в LA
14-го в 12:00 UTC или раньше числа создаем 15-е - в это время начинаеся 15-е в NZ (таймзона +12)
ALTER TABLE t
DROP PARTITION p20190512;
ALTER TABLE t
REORGANIZE PARTITION future INTO (
partition p20190515 values less than (to_days('2019-05-16')),
partition future values less than maxvalue
)
;
- date должен быть во всех индексах и не должен быть в индексе первым!
- при удалении вчера удаляется и то что в start
- если прозевал alter - ничего страшного - будет писаться в future хоть неделю, потом надо:
- если пару дней, то сделать alter + drop последовательно за каждый день пропущенный день
- если много дней, то drop всех парт. кроме start и future, затем 2 раза REORGANIZE future - создание за сегодня и завтра
SELECT PARTITION_NAME, PARTITION_ORDINAL_POSITION, DATA_LENGTH, INDEX_LENGTH
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 't'
AND TABLE_SCHEMA = 'products'
;
# +----------------+----------------------------+-------------+--------------+
# | PARTITION_NAME | PARTITION_ORDINAL_POSITION | DATA_LENGTH | INDEX_LENGTH |
# +----------------+----------------------------+-------------+--------------+
# | start | 1 | 16384 | 16384 |
# | p20190512 | 2 | 16384 | 16384 |
# | p20190513 | 3 | 16384 | 16384 |
# | p20190514 | 4 | 16384 | 16384 |
# | future | 5 | 16384 | 16384 |
# +----------------+----------------------------+-------------+--------------+
explain partitions select * from t where date = '2019-05-12';
# +----+-------------+-------+------------+-------+---------------+-------+---------+--------+------+--------------------------+
# | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |
# +----+-------------+-------+------------+-------+---------------+-------+---------+--------+------+--------------------------+
# | 1 | SIMPLE | t | p20190512 | index | <null> | key_b | 7 | <null> | 3 | Using where; Using index |
# +----+-------------+-------+------------+-------+---------------+-------+---------+--------+------+--------------------------+