Как разделить таблицу MyISAM по дням в MySQL - PullRequest
2 голосов
/ 13 января 2011

Я хочу сохранить последние 45 дней данных журнала в таблице MySQL для статистической отчетности.Каждый день может быть 20-30 миллионов строк.Я планирую создать плоский файл и использовать загрузку данных, чтобы получать данные каждый день.В идеале я бы хотел, чтобы каждый день имел свой собственный раздел без необходимости писать скрипт для создания раздела каждый день.

Есть ли способ в MySQL просто сказать, что каждый день автоматически получает свой собственный раздел?

спасибо

Ответы [ 4 ]

1 голос
/ 13 января 2011

Я бы настоятельно рекомендовал использовать Redis или Cassandra вместо MySQL для хранения данных с большим трафиком, таких как журналы.Тогда вы можете выполнять потоковую передачу в течение всего дня вместо ежедневного импорта.

Подробнее об этих двух (и более) вы можете прочитать в этом сравнении баз данных "NoSQL" .

Если вы настаиваете на MySQL, я думаю, что проще всего будет просто создать новую таблицу в день, например, logs_2011_01_13, а затем загрузить все это туда.Это делает удаление старых дат очень простым, и вы также можете легко перемещать разные таблицы на разные серверы.

0 голосов
/ 27 июля 2016

Я наткнулся на этот вопрос, когда искал что-то еще, и хотел указать на механизм хранения MERGE (http://dev.mysql.com/doc/refman/5.7/en/merge-storage-engine.html).

Хранилище MERGE представляет собой более или менее простой указатель на несколько таблиц и может бытьпеределывать за считанные секунды. Для циклических журналов это может быть очень мощно! Вот что я бы сделал:

Создайте одну таблицу в день, используйте LOAD DATA в качестве OP, упомянутого как OP, чтобы заполнить ее. Как только это будет сделано, отбросьтетаблицу MERGE и воссоздайте ее, включая эту новую таблицу, пропуская самую старую. После этого я мог бы удалить / заархивировать старую таблицу. Это позволило бы мне быстро запросить конкретный день или все, как исходные таблицы, так и таблицы MERGE.допустимо.

CREATE TABLE logs_day_46 LIKE logs_day_45 ENGINE=MyISAM;
DROP TABLE IF EXISTS logs;
CREATE TABLE logs LIKE logs_day_46 ENGINE=MERGE UNION=(logs_day_2,[...],logs_day_46);
DROP TABLE logs_day_1;

Обратите внимание, что таблица MERGE не совпадает с таблицей PARTIONNED и предлагает некоторые преимущества и неудобства. Но помните, что если вы пытаетесь агрегировать из всех таблиц, это будет медленнее, чем есливсе данные были только в одной таблице (то же самое верно для разделов, так как они в основном разные таблицы под капотом).Вы будете выполнять запросы в основном в определенные дни, вам нужно будет выбрать таблицу самостоятельно, но если разбиения будут выполнены по значениям дня, MySQL автоматически получит правильные таблицы, которые могут появиться быстрее и проще для написания.

0 голосов
/ 29 мая 2014

Да, вы можете разбить таблицы MySQL по дате:

CREATE TABLE ExampleTable (
  id INT AUTO_INCREMENT,
  d DATE,
  PRIMARY KEY (id, d)
) PARTITION BY RANGE COLUMNS(d) (
  PARTITION p1 VALUES LESS THAN ('2014-01-01'),
  PARTITION p2 VALUES LESS THAN ('2014-01-02'),
  PARTITION pN VALUES LESS THAN (MAXVALUE)
);

Позже, когда вы приблизитесь к переполнению в раздел pN, вы можете разделить его:

ALTER TABLE ExampleTable REORGANIZE PARTITION pN INTO (
  PARTITION p3 VALUES LESS THAN ('2014-01-03'), 
  PARTITION pN VALUES LESS THAN (MAXVALUE)
);

Это не автоматически разделение по дате, но вы можете реорганизовать, когда вам нужно. Лучше всего реорганизовать, прежде чем заполнять последний раздел, поэтому операция будет быстрой.

0 голосов
/ 29 мая 2014

er .., нумеруйте их в Mod 45 с помощью составного ключа и циклически просматривайте их ...

Серьезно, 1 таблица в день была допустимым предложением, и, поскольку это статические данные, я бы создал упакованный MyISAMв зависимости от способности моего хозяина сортировать.

Построение запросов для объединения некоторых или всех из них будет только умеренно сложной задачей.

1 таблица в день, и разделите их, чтобы улучшить производительность загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...