sql >> Databáze >  >> RDS >> Mysql

Nejlepší způsob, jak uložit obrovská data protokolu

Rozdělení v postgresql funguje skvěle pro velké protokoly. Nejprve vytvořte nadřazenou tabulku:

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

Nyní vytvořte oddíly. V tomto případě by byl dobrý jeden na každý měsíc, 900 tisíc řádků:

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

Všimněte si kontrolních omezení v každém oddílu. Pokud se pokusíte vložit do nesprávného oddílu:

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

Jednou z výhod dělení je, že bude vyhledávat pouze ve správném oddílu, což drasticky a konzistentně sníží velikost vyhledávání bez ohledu na to, kolik let jsou k dispozici data. Zde je vysvětlení pro hledání určitého 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)

Všimněte si, že kromě nadřazené tabulky skenoval pouze správný oddíl. Samozřejmě můžete mít na oddílech indexy, abyste se vyhnuli sekvenčnímu skenování.

Dědičnost Rozdělení



  1. as3, připojení MySQL PHP

  2. Řetězcová proměnná PHP v klauzuli WHERE MySQL

  3. Získejte řádky z tabulky mysql do polí php

  4. Přidejte sloupec ke všem vybraným dotazům MySQL najednou