Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara terbaik untuk menyimpan data log yang besar

Mempartisi di postgresql berfungsi dengan baik untuk log besar. Pertama buat tabel induknya:

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

Sekarang buat partisi. Dalam hal ini satu untuk setiap bulan, 900 k baris, akan bagus:

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

Perhatikan batasan pemeriksaan di setiap partisi. Jika Anda mencoba memasukkan partisi yang salah:

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

Salah satu keuntungan dari mempartisi adalah hanya akan mencari di partisi yang benar mengurangi ukuran pencarian secara drastis dan konsisten terlepas dari berapa tahun data yang ada. Berikut penjelasan untuk pencarian tanggal tertentu:

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)

Perhatikan bahwa selain dari tabel induk itu hanya memindai partisi yang benar. Jelas Anda dapat memiliki indeks pada partisi untuk menghindari pemindaian berurutan.

Warisan Partisi



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL Query untuk memilih data dari minggu lalu?

  2. Symfony3 - SQLSTATE[HY000] [2002] Tidak ada file atau direktori seperti itu

  3. MAX() – Temukan Nilai Maksimum dalam Kolom di MySQL

  4. SQL SELECT --> file csv

  5. Golang, mysql:Kesalahan 1040:Terlalu banyak koneksi