0%

MySQL 表分区使用

使用MySQL数据库时,当表的数据条数比较大时(1000w以上),数据查询会很慢,索引的效果也不好。

这时我们可以把表的数据分区存储,安装数据值的前缀或者时间字段来分区。

建表

1
2
3
4
5
6
7
8
9
CREATE TABLE test_part (
appid int(11),
val int(11),
username VARCHAR(25) NOT NULL,
start_time DATETIME
)
PARTITION BY RANGE (TO_DAYS(start_time) )(
PARTITION p20190305 VALUES LESS THAN (TO_DAYS('2019-03-06 00:00:00') )
)

删除分区

alter table test_part drop partition p1;

不可以删除hash或者key分区。

一次性删除多个分区,alter table test_part drop partition p1,p2;

增加分区

ALTER TABLE test_part ADD partition (partition p20190306 VALUES LESS THAN (TO_DAYS(‘2019-03-07 00:00:00’)));

生成测试数据

创建储存过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DROP PROCEDURE IF EXISTS proc1;
DELIMITER $$
SET AUTOCOMMIT = 0$$
CREATE PROCEDURE proc1()
BEGIN
DECLARE v_cnt DECIMAL (10) DEFAULT 0 ;
dd:LOOP
INSERT INTO test_part VALUES (
FLOOR(RAND()*100),
FLOOR(RAND()*1000),
UUID(),
DATE_ADD('2019-03-04 00:00:00', INTERVAL FLOOR(v_cnt / 5000) MINUTE)
);
COMMIT;
SET v_cnt = v_cnt+1 ;
IF v_cnt = 10000000 THEN LEAVE dd;
END IF;
END LOOP dd ;
END;$$
DELIMITER ;
```

调用储存过程

call proc1;
`