sql >> Databasteknik >  >> RDS >> Mysql

Bästa sättet att lagra enorma loggdata

Partitionering i postgresql fungerar utmärkt för stora loggar. Skapa först den överordnade tabellen:

create table  game_history_log (
    gameid integer,
    views integer,
    plays integer,
    likes integer,
    log_date date
);

Skapa nu partitionerna. I det här fallet skulle en för varje månad, 900 k rader, vara bra:

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);

Lägg märke till kontrollbegränsningarna i varje partition. Om du försöker infoga i fel partition:

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).

En av fördelarna med partitionering är att det bara kommer att söka i rätt partition, vilket drastiskt och konsekvent minskar sökstorleken oavsett hur många år av data det finns. Här förklaras för sökningen efter ett visst datum:

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)

Observera att förutom den överordnade tabellen bara skannade den rätt partition. Självklart kan du ha index på partitionerna för att undvika en sekventiell genomsökning.

Arv Partitionering



  1. lagra antalet rader eller bara räkna raderna?

  2. SQL Server 2016:View Designer

  3. Hur man får en rest med MOD() i PostgreSQL, MS SQL Server och MySQL

  4. SQL-syntaxfel vid laddning av databasfil (möjligt versionsfel?)