Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Najlepszy sposób na przechowywanie ogromnych danych dziennika

Partycjonowanie w postgresql świetnie sprawdza się w przypadku dużych logów. Najpierw utwórz tabelę nadrzędną:

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

Teraz utwórz partycje. W tym przypadku jeden na każdy miesiąc, 900 tys. wierszy, byłby dobry:

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

Zwróć uwagę na ograniczenia sprawdzające w każdej partycji. Jeśli spróbujesz wstawić niewłaściwą partycję:

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

Jedną z zalet partycjonowania jest to, że przeszukuje tylko właściwą partycję, drastycznie i konsekwentnie zmniejszając rozmiar wyszukiwania, niezależnie od tego, ile lat są dane. Oto wyjaśnienie wyszukiwania określonej daty:

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)

Zauważ, że oprócz tabeli nadrzędnej skanował tylko właściwą partycję. Oczywiście możesz mieć indeksy na partycjach, aby uniknąć sekwencyjnego skanowania.

Dziedziczenie Partycjonowanie



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapętl wstawiaj Zapytanie w PHP

  2. Zapytanie LIKE MySQL z podkreśleniem

  3. INET_ATON() i INET_NTOA() w PHP?

  4. Jak uzyskać wynikowy zestaw wyników MySQL w pythonie?

  5. Skopiuj tabele z inną nazwą kolumny MySQL