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

làm thế nào để phân vùng bảng theo cột ngày giờ?

Phân vùng bằng HASH là một ý tưởng rất tồi với các cột datetime, vì nó không thể sử dụng cắt bớt phân vùng . Từ tài liệu MySQL:

SELECT * FROM t4 WHERE dob >= '2001-04-14' AND dob <= '2005-10-15';

Vì vậy, bạn có thể lưu trữ giá trị của TO_DAYS (DATE ()) trong một cột INTEGER bổ sung để sử dụng việc cắt bớt.

Một tùy chọn khác là sử dụng phân vùng RANGE:

CREATE TABLE raw_log_2011_4 (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  logid char(16) NOT NULL,
  tid char(16) NOT NULL,
  reporterip char(46) DEFAULT NULL,
  ftime datetime DEFAULT NULL,
  KEY id (id)
) ENGINE=InnoDB AUTO_INCREMENT=286802795 DEFAULT CHARSET=utf8
  PARTITION BY RANGE( TO_DAYS(ftime) ) (
    PARTITION p20110401 VALUES LESS THAN (TO_DAYS('2011-04-02')),
    PARTITION p20110402 VALUES LESS THAN (TO_DAYS('2011-04-03')),
    PARTITION p20110403 VALUES LESS THAN (TO_DAYS('2011-04-04')),
    PARTITION p20110404 VALUES LESS THAN (TO_DAYS('2011-04-05')),
    ...
    PARTITION p20110426 VALUES LESS THAN (TO_DAYS('2011-04-27')),
    PARTITION p20110427 VALUES LESS THAN (TO_DAYS('2011-04-28')),
    PARTITION p20110428 VALUES LESS THAN (TO_DAYS('2011-04-29')),
    PARTITION p20110429 VALUES LESS THAN (TO_DAYS('2011-04-30')),
    PARTITION future VALUES LESS THAN MAXVALUE
  );

Bây giờ truy vấn sau sẽ chỉ sử dụng phân vùng p20110403:

SELECT * FROM raw_log_2011_4 WHERE ftime = '2011-04-03';


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JPA tồn tại nhiều đến nhiều

  2. MySQL - Không thể chèn giá trị NULL vào cột, nhưng tôi có một giá trị mặc định được chỉ định?

  3. Làm cách nào để viết lại thành công mã mysql-php cũ bằng các hàm mysql_ * không dùng nữa?

  4. PHP-MYSQL:Chuyển đổi Unix Timestamp thành DateTime và ngược lại

  5. ORDER BY RAND () thay thế