Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Melhor maneira de armazenar dados de log enormes


O particionamento no postgresql funciona muito bem para grandes logs. Primeiro crie a tabela pai:
create table  game_history_log (
    gameid integer,
    views integer,
    plays integer,
    likes integer,
    log_date date
);

Agora crie as partições. Neste caso, uma para cada mês, 900 mil linhas, seria bom:
create table game_history_log_201210 (
    check (log_date between '2012-10-01' and '2012-10-31')
) inherits (game_history_log);

create table game_history_log_201211 (
    check (log_date between '2012-11-01' and '2012-11-30')
) inherits (game_history_log);

Observe as restrições de verificação em cada partição. Se você tentar inserir na partição errada:
insert into game_history_log_201210 (
    gameid, views, plays, likes, log_date
) values (1, 2, 3, 4, '2012-09-30');
ERROR:  new row for relation "game_history_log_201210" violates check constraint "game_history_log_201210_log_date_check"
DETAIL:  Failing row contains (1, 2, 3, 4, 2012-09-30).

Uma das vantagens do particionamento é que ele pesquisará apenas na partição correta, reduzindo drasticamente e consistentemente o tamanho da pesquisa, independentemente de quantos anos de dados existam. Aqui a explicação para a busca por uma determinada data:
explain
select *
from game_history_log
where log_date = date '2012-10-02';
                                              QUERY PLAN                                              
------------------------------------------------------------------------------------------------------
 Result  (cost=0.00..30.38 rows=9 width=20)
   ->  Append  (cost=0.00..30.38 rows=9 width=20)
         ->  Seq Scan on game_history_log  (cost=0.00..0.00 rows=1 width=20)
               Filter: (log_date = '2012-10-02'::date)
         ->  Seq Scan on game_history_log_201210 game_history_log  (cost=0.00..30.38 rows=8 width=20)
               Filter: (log_date = '2012-10-02'::date)

Observe que, além da tabela pai, ele varreu apenas a partição correta. Obviamente, você pode ter índices nas partições para evitar uma varredura sequencial.

Herança Particionamento