Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách tốt nhất để lưu trữ dữ liệu nhật ký khổng lồ

Phân vùng trong postgresql hoạt động tốt cho các bản ghi lớn. Đầu tiên, hãy tạo bảng mẹ:

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

Bây giờ tạo các phân vùng. Trong trường hợp này, một cho mỗi tháng, 900 k hàng, sẽ là tốt:

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ưu ý các ràng buộc kiểm tra trong mỗi phân vùng. Nếu bạn cố gắng chèn vào phân vùng sai:

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

Một trong những lợi thế của phân vùng là nó sẽ chỉ tìm kiếm trong phân vùng chính xác làm giảm đáng kể và nhất quán kích thước tìm kiếm bất kể dữ liệu đó có bao nhiêu năm. Đây là lời giải thích cho việc tìm kiếm một ngày nhất định:

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)

Lưu ý rằng ngoài bảng cha, nó chỉ quét đúng phân vùng. Rõ ràng là bạn có thể có các chỉ mục trên các phân vùng để tránh bị quét tuần tự.

Kế thừa Phân vùng



  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 bao gồm 0 hàng khi sử dụng COUNT với GROUP BY

  2. Truy vấn MySQL với nhiều bảng

  3. Chọn hàng cuối cùng trong MySQL

  4. Làm thế nào để sử dụng một hàm SQL với INNER JOIN trong MySQL?

  5. Cần trợ giúp về cách chèn dữ liệu được phân tách bằng dấu phẩy trong cơ sở dữ liệu mysql bằng PHP