2011-01-12 2 views
2

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

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

благодаря

ответ

1

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

Вы можете узнать больше об этих двух (и более) в этом comparison of "NoSQL" databases.

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

+1

redis не поддерживает специальные SQL-запросы, а Cassandra переполнена для 20-30 миллионов строк и нестабильна. – James

+0

Очевидно, что это не SQL-движки. Я не притворяюсь иначе. Redis может сделать довольно некоторый анализ, но это не то же самое наверняка. Я бы не рекомендовал Кассандру, если у вас нет денег, чтобы иметь множество узлов. Последний бит моего ответа пытался решить MySQL. – Seldaek

0

ээ .., пронумеровать их в Mod 45 с составным ключом и цикл через них ...

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

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

1 таблица в день и разделяйте их для повышения производительности.

0

Да, вы можете разделить таблицы 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

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

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

Создайте один стол в день, используйте LOAD DATA, как указано в OP, чтобы заполнить его. Как только это будет сделано, отбросьте таблицу MERGE и заново создайте ее, включая эту новую таблицу, в то время как она станет самой старой. После этого я могу удалить/архивировать старую таблицу. Это позволит мне быстро запросить конкретный день или все, что и как таблицы orignal, так и 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 один и некоторые преимущества и inconvenients.Но помните, что если вы пытаетесь агрегировать из всех таблиц, это будет медленнее, чем если бы все данные находились только в одной таблице (то же самое верно для разделов, поскольку они в основном представляют собой разные таблицы под капотом). Если вы собираетесь запрашивать в основном в определенные дни, вам нужно будет выбрать таблицу самостоятельно, но если разделы будут выполняться в значениях дня, MySQL автоматически захватит правильную таблицу (таблицы), которая может быть быстрее и проще писать.

Смежные вопросы