Skip to content

Instantly share code, notes, and snippets.

@ll14m4n
Last active May 31, 2019 17:16
Show Gist options
  • Save ll14m4n/98bd7bdcb9cac800347cb40954a7892f to your computer and use it in GitHub Desktop.
Save ll14m4n/98bd7bdcb9cac800347cb40954a7892f to your computer and use it in GitHub Desktop.

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 |
#     +----+-------------+-------+------------+-------+---------------+-------+---------+--------+------+--------------------------+
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment