Mysql
 sql >> база данни >  >> RDS >> Mysql

Най-добрият начин за съхраняване на огромни регистрационни данни

Разделянето в postgresql работи чудесно за големи регистрационни файлове. Първо създайте родителската таблица:

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

Сега създайте дяловете. В този случай един за всеки месец, 900 k реда, би било добре:

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

Обърнете внимание на ограниченията за проверка във всеки дял. Ако се опитате да вмъкнете в грешен дял:

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

Едно от предимствата на разделянето е, че то ще търси само в правилния дял, намалявайки драстично и последователно размера на търсене, независимо от това колко години има данни. Ето обяснението за търсене на определена дата:

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)

Забележете, че освен родителската таблица, тя сканира само правилния дял. Очевидно можете да имате индекси на дяловете, за да избегнете последователно сканиране.

Наследяване Разделяне на дялове



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Коя е най-добрата СУБД за работата?

  2. php json_encode mysql резултат

  3. Отказан достъп; имате нужда (поне едно от) SUPER привилегията(ите) за тази операция

  4. MySQL:Как да разрешите отдалечена връзка с mysql

  5. Кеширане на данни в PHP SESSION или заявка от db всеки път?