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

MySQL:Tách một bảng lớn thành các phân vùng hay các bảng riêng biệt?

Chà, nếu bạn đang hy vọng một câu trả lời mới, điều đó có nghĩa là bạn có thể đã đọc câu trả lời của tôi, và tôi nghe như một kỷ lục bị phá vỡ. Xem Blog phân vùng đối với một số trường hợp sử dụng mà phân vùng có thể giúp hiệu suất. Của bạn không không giống như bất kỳ trường hợp nào trong số 4 trường hợp.

Thu nhỏ device_id . INT là 4 byte; bạn thực sự có hàng triệu thiết bị? TINYINT UNSIGNED là 1 byte và phạm vi 0..255. SMALLINT UNSIGNED là 2 byte và phạm vi 0..64K. Điều đó sẽ thu nhỏ bảng một chút.

Nếu thật của bạn câu hỏi là làm thế nào để quản lý rất nhiều dữ liệu, sau đó chúng ta hãy "suy nghĩ bên ngoài". Đọc tiếp.

Vẽ đồ thị ... Bạn đang vẽ đồ thị cho những phạm vi ngày nào?

  • Giờ 'cuối cùng' / ngày / tuần / tháng / năm?
  • Một giờ / ngày / tuần / tháng / năm tùy ý?
  • Một phạm vi tùy ý, không bị ràng buộc với ranh giới ngày / tuần / tháng / năm?

Bạn đang vẽ đồ thị gì?

  • Giá trị trung bình trong một ngày?
  • Tối đa / phút trong một ngày?
  • Chân nến (v.v.) cho ngày hoặc tuần hoặc bất cứ điều gì?

Bất kể trường hợp nào, bạn nên xây dựng (và từng bước duy trì) một Bảng Tóm tắt với dữ liệu. Một hàng sẽ chứa thông tin tóm tắt trong một giờ. Tôi sẽ đề nghị

CREATE TABLE Summary (
    device_id SMALLINT UNSIGNED NOT NULL,
    sensor_id TINYINT UNSIGNED NOT NULL,
    hr TIMESTAMP NOT NULL,
    avg_val FLOAT NOT NULL,
    min_val FLOAT NOT NULL,
    max_val FLOAT NOT NULL
    PRIMARY KEY (device_id, sensor_id, hr)
) ENGINE=InnoDB;

Một bảng Tóm tắt có thể là 9GB (đối với lượng dữ liệu hiện tại).

SELECT hr,
       avg_val,
       min_val,
       max_val
    FROM Summary
    WHERE device_id = ?
      AND sensor_id = ?
      AND hr >= ?
      AND hr  < ? + INTERVAL 20 DAY;

Sẽ cung cấp cho bạn các giá trị hi / lo / trung bình trong 480 giờ; đủ để vẽ đồ thị? Lấy 480 hàng từ bảng tóm tắt nhanh hơn rất nhiều so với việc lấy 60 * 480 hàng từ bảng dữ liệu thô.

Nhận dữ liệu tương tự trong một năm có thể sẽ làm nghẹt một gói đồ thị, vì vậy nó có thể đáng để xây dựng một bản tóm tắt - với độ phân giải của một ngày. Nó sẽ là khoảng 0,4GB.

Có một số cách khác nhau để xây dựng (các) bảng Tóm tắt; chúng ta có thể thảo luận về điều đó sau khi bạn đã cân nhắc về vẻ đẹp của nó và đọc Blog bảng tóm tắt . Có thể là thu thập dữ liệu có giá trị trong một giờ, sau đó bổ sung bảng Tóm tắt, là cách tốt nhất. Điều đó sẽ giống như cú lật ngược được thảo luận blog bảng Staging của tôi .

Và, nếu bạn có bản tóm tắt hàng giờ, bạn có thực sự cần dữ liệu từng phút không? Cân nhắc việc vứt bỏ nó. Hoặc, có thể dữ liệu sau một tháng. Điều đó dẫn đến việc sử dụng phân vùng, nhưng chỉ vì lợi ích của nó trong việc xóa dữ liệu cũ như đã thảo luận trong "Trường hợp 1" của blog phân vùng . Đó là, bạn sẽ có các phân vùng hàng ngày, sử dụng DROPREORGANIZE mỗi đêm để thay đổi thời gian của bảng "Sự thật". Điều này sẽ dẫn đến việc giảm dung lượng 145GB của bạn, nhưng không làm mất nhiều dữ liệu. Dấu ấn mới:Khoảng 12GB (Tóm tắt hàng giờ + chi tiết từng phút trong 30 ngày qua)

Tái bút: blog Bảng Tóm tắt chỉ ra cách nhận được độ lệch chuẩn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Có thể chèn dữ liệu vào hai bảng khác nhau trong mysql bằng một php truy vấn chèn không?

  2. Kích hoạt trước khi xóa MySql

  3. Ví dụ về ADDTIME () - MySQL

  4. MySQL nhận giá trị không rỗng đầu tiên sau khi nhóm theo

  5. tôi có thể tin tưởng mysql_insert_id () trả về giá trị chính xác không, hoang tưởng đa luồng