TO_DAYS() 函数在 MySQL 中用于将日期转换为从基准日期 '0000-00-00' 开始的天数。这个函数非常有用,特别是在需要对日期进行数值比较或计算日期之间的差异时。

下面是一个使用 TO_DAYS() 函数创建分区表的例子:

创建表

首先,我们需要创建一个表并定义分区。这里我们将创建一个名为 orders 的表,该表记录订单信息,并按订单日期进行分区。

CREATE TABLE orders (
    order_id INT AUTO_INCREMENT,
    customer_id INT,
    order_date DATE,
    total_amount DECIMAL(10, 2),
    PRIMARY KEY (order_id)
)
PARTITION BY RANGE (TO_DAYS(order_date))
(
    PARTITION p2022 VALUES LESS THAN (738346),  -- 2022-01-01
    PARTITION p2023 VALUES LESS THAN (738711),  -- 2023-01-01
    PARTITION p2024 VALUES LESS THAN (739076),  -- 2024-01-01
    PARTITION p2025 VALUES LESS THAN (739441),  -- 2025-01-01
    PARTITION p_default VALUES LESS THAN MAXVALUE
);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

在这个例子中,我们定义了四个分区,每个分区代表一年的数据。TO_DAYS(order_date) 将订单日期转换为天数,然后根据这个天数值来确定订单属于哪个分区。

插入数据

接下来,我们可以插入一些示例数据到这个表中:

INSERT INTO orders (customer_id, order_date, total_amount)
VALUES (1, '2022-03-01', 150.00),
       (2, '2023-05-15', 200.00),
       (3, '2024-07-20', 300.00),
       (4, '2025-11-30', 450.00);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
查询数据

现在,我们可以执行一些查询来验证数据是否正确存储在相应的分区中:

SELECT * FROM orders WHERE order_date BETWEEN '2022-01-01' AND '2022-12-31';
  • 1.

这个查询将返回所有2022年的订单数据。由于我们使用了 TO_DAYS() 函数来分区,MySQL 查询优化器可以有效地确定哪些分区需要被扫描,从而提高查询效率。

查看分区状态

我们还可以查看分区的状态以确认数据是如何分布的:

SHOW CREATE TABLE orders;
  • 1.

这将显示创建表的 SQL 语句以及分区的详细信息。

示例完整代码

将以上所有 SQL 语句组合在一起,完整的示例如下:

CREATE TABLE orders (
    order_id INT AUTO_INCREMENT,
    customer_id INT,
    order_date DATE,
    total_amount DECIMAL(10, 2),
    PRIMARY KEY (order_id)
)
PARTITION BY RANGE (TO_DAYS(order_date))
(
    PARTITION p2022 VALUES LESS THAN (738346),  -- 2022-01-01
    PARTITION p2023 VALUES LESS THAN (738711),  -- 2023-01-01
    PARTITION p2024 VALUES LESS THAN (739076),  -- 2024-01-01
    PARTITION p2025 VALUES LESS THAN (739441),  -- 2025-01-01
    PARTITION p_default VALUES LESS THAN MAXVALUE
);

INSERT INTO orders (customer_id, order_date, total_amount)
VALUES (1, '2022-03-01', 150.00),
       (2, '2023-05-15', 200.00),
       (3, '2024-07-20', 300.00),
       (4, '2025-11-30', 450.00);

SELECT * FROM orders WHERE order_date BETWEEN '2022-01-01' AND '2022-12-31';

SHOW CREATE TABLE orders;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.