MYsql分区使用

本文详细介绍了MySQL中分区表的创建及优化方法,包括通过多种方式获取分区表信息,如SHOW CREATE TABLE、SHOW TABLE STATUS及INFORMATION_SCHEMA.PARTITIONS表等。文章还列举了一个具体的GPS打卡记录表分区实例,展示了如何利用CREATE_TIME进行范围分区,提高数据检索效率。

作者官方网站:http://www.wxl568.cn

  几种获取MySQL分区表信息的常用方法

SHOW CREATE TABLE 可以查看创建分区表的CREATE语句
SHOW TABLE STATUS 可以查看表是否为分区表
查看INFORMATION_SCHEMA.PARTITIONS表 可以查看表具有哪几个分区、分区的方法、分区中数据的记录数等重要信息
select * from INFORMATION_SCHEMA.PARTITIONS
EXPLAIN PARTITIONS SELECT 查看select语句怎样使用分区

分区优点

1,分区可以分在多个磁盘,存储更大一点

2,根据查找条件,也就是where后面的条件,查找只查找相应的分区不用全部查找了

3,进行大数据搜索时可以进行并行处理。

4,跨多个磁盘来分散数据查询,来获得更大的查询吞吐量

下面实例整理

CREATE TABLE `tt_clock_log_wq` (
    `ID` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
    `EMP_CODE` VARCHAR(20) NOT NULL COMMENT '工号',
    `EQUIPMENT_NO` VARCHAR(255) NOT NULL COMMENT '设备编码',
    `MAC_ADDRESS` VARCHAR(50) NULL DEFAULT NULL COMMENT 'MAC地址(IOS丰声无法获取)',
    `CLOCK_TIME` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '打卡时间',
    `LONGITUDE` DOUBLE NOT NULL COMMENT '经度',
    `LATITUDE` DOUBLE NOT NULL COMMENT '纬度',
    `ADDRESS_ID` BIGINT(20) NULL DEFAULT NULL COMMENT '打卡物理地点ID(外勤打卡的情况下为空)',
    `STATUS` TINYINT(4) NOT NULL DEFAULT '1' COMMENT '状态1、成功 2、待审核 3、已提交ECP 4、失败',
    `PERSON_TYPE` TINYINT(4) NOT NULL DEFAULT '1' COMMENT '1为SAP,2为PMP',
    `REMARK` VARCHAR(255) NULL DEFAULT NULL COMMENT '备注',
    `OUTSIDE_CLOCK_ADDRESS` VARCHAR(255) NULL DEFAULT NULL COMMENT '外勤打卡地址',
    `SYNC_STATUS` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '是否已经同步,0为未同步,1为同步成功,2为同步失败,3为准备同步,4为同步中',
    `SYNC_TM` DATETIME NULL DEFAULT NULL COMMENT '同步时间',
    `mobile_Root` INT(1) NULL DEFAULT NULL COMMENT '是否越狱/root权限 0代表正常/1代表root/2代表没有获取到',
    `phone_Mode` INT(1) NULL DEFAULT NULL COMMENT '0代表安卓/1代表ios',
    `RUN_ID` VARCHAR(50) NULL DEFAULT NULL COMMENT 'ECP流程_RUN_ID',
    `ECP_STATUS` VARCHAR(10) NULL DEFAULT NULL COMMENT 'ECP回调状态 2(归档)、4(撤销)、5(驳回到发起节点)、10(删除)',
    `SYNC_FAIL_NUM` TINYINT(4) NULL DEFAULT '0' COMMENT '同步失败次数',
    `CREATE_TM` DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `BRAND_TYPE` VARCHAR(100) NULL DEFAULT NULL,
    `RESERVE1` VARCHAR(100) NULL DEFAULT NULL,
    `RESERVE2` VARCHAR(100) NULL DEFAULT NULL,
    `RESERVE3` VARCHAR(100) NULL DEFAULT NULL,
    `sapEtl` INT(4) NULL DEFAULT '0',
    `RESERVE4` VARCHAR(100) NULL DEFAULT NULL COMMENT '备用4状态',
    PRIMARY KEY (`ID`,`CREATE_TM`),
    INDEX `IDX_TT_CLOCK_LOG_TIME_EMP` (`CLOCK_TIME`, `EMP_CODE`),
    INDEX `IDX_TT_CLOCK_LOG_EMP` (`EMP_CODE`, `CLOCK_TIME`) USING BTREE
)
COMMENT='GPS打卡记录表'
COLLATE='utf8mb4_general_ci'
/*!50100 PARTITION BY RANGE  COLUMNS(CREATE_TM)
(PARTITION p20181103 VALUES LESS THAN ('2018-11-03') ENGINE = InnoDB,
 PARTITION p20181104 VALUES LESS THAN ('2018-11-04') ENGINE = InnoDB,
 PARTITION p20181105 VALUES LESS THAN ('2018-11-05') ENGINE = InnoDB,
 PARTITION p20181106 VALUES LESS THAN ('2018-11-06') ENGINE = InnoDB,
 PARTITION p20181107 VALUES LESS THAN ('2018-11-07') ENGINE = InnoDB,
 PARTITION p20181108 VALUES LESS THAN ('2018-11-08') ENGINE = InnoDB,
 PARTITION p20181109 VALUES LESS THAN ('2018-11-09') ENGINE = InnoDB,
 PARTITION p20181110 VALUES LESS THAN ('2018-11-10') ENGINE = InnoDB,
 PARTITION p20181111 VALUES LESS THAN ('2018-11-11') ENGINE = InnoDB,
 PARTITION p20181112 VALUES LESS THAN ('2018-11-12') ENGINE = InnoDB,
 PARTITION p20181113 VALUES LESS THAN ('2018-11-13') ENGINE = InnoDB,
 PARTITION p20181114 VALUES LESS THAN ('2018-11-14') ENGINE = InnoDB,
 PARTITION p20181115 VALUES LESS THAN ('2018-11-15') ENGINE = InnoDB,
 PARTITION p20181116 VALUES LESS THAN ('2018-11-16') ENGINE = InnoDB,
 PARTITION p20181117 VALUES LESS THAN ('2018-11-17') ENGINE = InnoDB,
 PARTITION p20181118 VALUES LESS THAN ('2018-11-18') ENGINE = InnoDB,
 PARTITION p20181119 VALUES LESS THAN ('2018-11-19') ENGINE = InnoDB,
 PARTITION p20181120 VALUES LESS THAN ('2018-11-20') ENGINE = InnoDB,
 PARTITION p20181121 VALUES LESS THAN ('2018-11-21') ENGINE = InnoDB,
 PARTITION p20181122 VALUES LESS THAN ('2018-11-22') ENGINE = InnoDB,
 PARTITION p20181123 VALUES LESS THAN ('2018-11-23') ENGINE = InnoDB,
 PARTITION p20181124 VALUES LESS THAN ('2018-11-24') ENGINE = InnoDB,
 PARTITION p20181125 VALUES LESS THAN ('2018-11-25') ENGINE = InnoDB,
 PARTITION p20181126 VALUES LESS THAN ('2018-11-26') ENGINE = InnoDB,
 PARTITION p20181127 VALUES LESS THAN ('2018-11-27') ENGINE = InnoDB,
 PARTITION p20181128 VALUES LESS THAN ('2018-11-28') ENGINE = InnoDB,
 PARTITION p20181129 VALUES LESS THAN ('2018-11-29') ENGINE = InnoDB,
 PARTITION p20181130 VALUES LESS THAN ('2018-11-30') ENGINE = InnoDB,
 PARTITION p20181201 VALUES LESS THAN ('2018-12-01') ENGINE = InnoDB,
 PARTITION p20181202 VALUES LESS THAN ('2018-12-02') ENGINE = InnoDB,
 PARTITION p20181203 VALUES LESS THAN ('2018-12-03') ENGINE = InnoDB,
 PARTITION p20181204 VALUES LESS THAN ('2018-12-04') ENGINE = InnoDB,
 PARTITION p20181205 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB)  */;
 

### MySQL 分区使用方法 对于希望利用MySQL分区功能来优化数据库性能和管理大规模数据集的情况,提前规划至关重要。在创建表之初就应该考虑好如何设计分区方案,并制定相应的维护策略[^1]。 #### 创建分区表 要创建一个带有分区的表格,可以在`CREATE TABLE`语句中指定分区选项。以下是几种常见的分区方式: - **RANGE分区**:基于给定范围内的值进行划分。 ```sql CREATE TABLE sales ( id INT NOT NULL, sale_date DATE NOT NULL, amount DECIMAL(10,2), PRIMARY KEY (id,sale_date) ) PARTITION BY RANGE (TO_DAYS(sale_date)) ( PARTITION p0 VALUES LESS THAN (TO_DAYS('2023-01-01')), PARTITION p1 VALUES LESS THAN (TO_DAYS('2024-01-01')) ); ``` - **LIST分区**:根据列表中的离散值来进行分割 ```sql CREATE TABLE employees ( emp_no INT NOT NULL, hire_date DATE NOT NULL, dept VARCHAR(40), salary DECIMAL(10,2), PRIMARY KEY(emp_no,hire_date) ) PARTITION BY LIST(COLUMN_NAME) ( PARTITION p_sales VALUES IN ('Sales'), PARTITION p_marketing VALUES IN ('Marketing') ); ``` - **HASH分区** 和 **KEY分区** :通过哈希函数计算得出的结果分配记录到不同的分区内 ```sql -- HASH Partitioning Example CREATE TABLE payments ( payment_id INT NOT NULL AUTO_INCREMENT, customer_id INT NOT NULL, amount DECIMAL(10,2), pay_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY(payment_id,customer_id) ) ENGINE=InnoDB PARTITION BY HASH(YEAR(pay_date)) PARTITIONS 8; -- KEY Partitioning is similar to HASH but uses a built-in hash function. ``` #### 维护与调整 随着时间推移,可能需要增加新的分区或删除旧的数据分区。可以通过 `ALTER TABLE ... ADD PARTITION` 或者 `DROP PARTITION` 来实现这些变更操作。不过需要注意的是,在某些情况下(比如删除分区),可能会丢失该分区内存储的所有数据,因此务必谨慎行事。 #### 查询优化技巧 为了使查询更加高效,应当遵循一些基本原则,例如避免对索引字段执行复杂的表达式运算,这样可以让MySQL更好地利用已有的索引结构来加速检索过程[^3]。 ```sql -- 不推荐的做法 SELECT * FROM orders WHERE YEAR(order_date)+MONTH(order_date)=2023; -- 推荐做法 SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31'; ``` #### 参考资源 官方文档提供了详细的指导手册以及丰富的实例案例供学习参考。访问 [MySQL Official Documentation](https://dev.mysql.com/doc/) 获取更多信息和支持材料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值