
# Range算法
#### 适用场景
适用于范围类操作较多的场景。在SQL查询条件中，使用"\>"、"\<"、"BETWEEN ... AND ..."之类运算符相对较多。
#### 使用说明
拆分键的类型只支持整型类型、日期类型和日期函数结合，如果使用日期函数，拆分键的数据类型必须是date、datetime、timestamp其一。
#### 路由方式
根据拆分键，按照算法元数据的规则将数据行存储到相应的分片上。
建表时要设定元数据，假如逻辑库分8个分片，则元数据可以设定的范围为：1-2=0，3-4=1，5-6=2，7-8=3，9-10=4，11-12=5，13-14=6，default=7。根据拆分键的值在某个范围路由到对应的分片上。
#### 算法计算方式
**方式一：** **拆分键是整型**
表1拆分键是整型时的计算方式 
| **条件** | 算法                              | **举例**                   |
|:---|:---|:---|
| 拆分键是整型 | 分库路由结果 = 根据分库拆分键值在设定的元数据的范围进行路由 | 分库 ：拆分值为3属于3-4=1，则路由到1分片 |
   
**方式二：拆分键是日期类型**
表2支持的日期函数 
| **日期函数**     | 算法                                                                                                                                                                                                                                                             | **举例**                      |
|:---|:---|:---|
| year()       | year(yyyy-MM-dd)=yyyy                                                                                                                                                                                                                                          | year('2019-10-11')=2019     |
| month()      | month(yyyy-MM-dd)=MM                                                                                                                                                                                                                                           | month('2019-10-11')=10      |
| weekofyear() | weekofyear(yyyy-MM-dd)=该日期是今年的第几周 说明： 关于一年中的第几周的定义请参见[WEEKOFYEAR(*date*)](https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_weekofyear)。 | weekofyear('2019-10-11')=41 |
| day()        | day(yyyy-MM-dd)=该日期是月份的第几天                                                                                                                                                                                                                                     | day('2019-10-11')=11        |
   
表3拆分键是日期类型时的计算方式 
| **条件**   | **算法**                               | **举例**                                     |
|:---|:---|:---|
| 拆分键是日期类型 | 分库路由结果 =根据日期函数(分库拆分键值)在设定的元数据的范围进行路由 | 分库 ：month('2019-10-11')=10属于9-10=4，则路由到4分片 |
   
#### 建表语法
```
create table range_tb(
    id int,
    name varchar(30) DEFAULT NULL,
    create_time datetime DEFAULT NULL,
    primary key(id)
    )
dbpartition by range(id)
{     
    1-2=0,
    3-4=1, 
    5-6=2, 
    7-8=3, 
    9-10=4, 
    11-12=5,
    13-14=6,
    default=7 
};
```
#### 注意事项
无。
