CREATE TABLE jobs (
    job_id VARCHAR(255) NOT NULL,    
    creation_date DATE NOT NULL,    -- 其他列定义    
    PRIMARY KEY (creation_date, job_id)
)
PARTITION BY RANGE (MONTH(creation_date))(    
PARTITION p1 VALUES LESS THAN (2),  
PARTITION p2 VALUES LESS THAN (3),    
PARTITION p3 VALUES LESS THAN (4),    
PARTITION p4 VALUES LESS THAN (5),    
PARTITION p5 VALUES LESS THAN (6),    
PARTITION p6 VALUES LESS THAN (7),    
PARTITION p7 VALUES LESS THAN (8),    
PARTITION p8 VALUES LESS THAN (9),    
PARTITION p9 VALUES LESS THAN (10),    
PARTITION p10 VALUES LESS THAN (11),    
PARTITION p11 VALUES LESS THAN (12),    
PARTITION p12 VALUES LESS THAN (13)
);

在上述的CREATE TABLE语句中,jobs表被定义为一个范围分区表,分区键是creation_date的月份。这个表的主键是(creation_date, job_id),这意味着creation_datejob_id共同构成了表的唯一标识。

分区定义

分区是按照creation_date的月份进行的,例如:

  • p1分区包含所有一月份的数据 (MONTH(creation_date) < 2)。
  • p2分区包含所有二月份的数据 (MONTH(creation_date) < 3)。
  • p12分区包含所有十二月份的数据 (MONTH(creation_date) < 13)。

分区索引

由于表被定义为主键是(creation_date, job_id),这实际上意味着主键索引也是分区索引。在这种情况下,主键索引是全局的,因为它覆盖了所有分区的数据。

查询creation_date是否会走分区索引

当你执行一个查询,比如SELECT * FROM jobs WHERE creation_date = '2024-08-01';,查询优化器会检查creation_date的值来确定哪些分区需要被访问。由于creation_date是分区键的一部分,查询优化器能够利用这一点来决定哪些分区需要被扫描。

在这个例子中,假设creation_date是8月份的数据,那么查询优化器将只扫描包含8月份数据的分区(即p8分区),而不会扫描其他月份的数据所在的分区。这意味着查询将有效地利用分区索引来减少需要扫描的数据量,从而提高查询效率。

注意事项

  • 如果查询条件中包含了creation_date,那么查询优化器可以有效地利用分区索引来减少扫描的数据量。
  • 如果查询条件中没有包含creation_date,或者包含的条件不足以确定要访问的具体分区,那么查询可能会扫描所有分区。
  • 如果查询条件中包含了主键的其他部分(如job_id),那么查询优化器也能够利用主键索引进一步减少扫描的数据量。

总结来说,如果查询条件中包含了creation_date,并且足够明确以确定具体的分区,那么查询将会有效地利用分区索引,只扫描相关的分区。这有助于提高查询性能,特别是当表非常大时。