Mysql 表分区
mysql 分区
2023-09-27 14:28:05 时间
最近工作中遇到一个情况,需要将使用Mysql存储海量的数据,需要使用Mysql分区的技术,那么下面是一个按照日期分表的一个事例:
CREATE TABLE `big_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `thedate` date DEFAULT NULL COMMENT '日期', `shop_id` bigint(20) DEFAULT NULL COMMENT 'ID', `auction_name` varchar(128) DEFAULT NULL COMMENT '名称', PRIMARY KEY (`id`,`thedate`), KEY `seller_id` (`seller_id`,`thedate`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION BY hash (dayofyear(thedate)) partitions 366;
一、创建分区表事例:
CREATE TABLE BIGTABLE ( ID INT, SNPTIME DATETIME NOT NULL, VALUE VARCHAR(20), PRIMARY KEY (SNPTIME, ID) ) ENGINE=InnoDB partition by range (TO_DAYS(SNPTIME)) ( PARTITION p1 VALUES LESS THAN (to_days('2009-1-31')), PARTITION p2 VALUES LESS THAN (to_days('2009-2-28')), PARTITION p3 VALUES LESS THAN (to_days('2008-3-31')), PARTITION p4 VALUES LESS THAN (to_days('2008-4-30')), PARTITION p5 VALUES LESS THAN (to_days('2008-5-31')), PARTITION p6 VALUES LESS THAN (to_days('2008-6-30')), PARTITION p7 VALUES LESS THAN (to_days('2008-7-31')), PARTITION p8 VALUES LESS THAN (to_days('2008-8-31')), PARTITION p9 VALUES LESS THAN (to_days('2008-9-30')), PARTITION p10 VALUES LESS THAN (to_days('2008-10-31')), PARTITION p11 VALUES LESS THAN (to_days('2008-11-30')), PARTITION p12 VALUES LESS THAN (to_days('2008-12-31')), PARTITION p13 VALUES LESS THAN MAXVALUE ) ;
注意一点:一定要有主键,并且主键要包括分区键。
二、给已存在的表加分区
alter table 表名 PARTITION BY RANGE (to_days(COLLECTTIME)) (PARTITION pmin VALUES LESS THAN (to_days('2010-01-01')), PARTITION p201001 VALUES LESS THAN (to_days('2010-02-01')) , ...... PARTITION pmax VALUES LESS THAN MAXVALUE );
如果表中已有数据,分区时会自动进行分区存储,不必担心数据丢失或者手动分类数据.
三、删除表中的指定分区
ALTER TABLE 表名 DROP PARTITION 分区名;
四、追加表分区
ALTER TABLE 表名 DROP PARTITION pmax; ALTER TABLE 表名 ADD PARTITION ( PARTITION p201201 VALUES LESS THAN (to_days('2012-2-1')), PARTITION pmax VALUES LESS THAN MAXVALUE);
五、查看标分区信息
SELECT partition_name part, partition_expression expr, partition_description descr, table_rows FROM INFORMATION_SCHEMA.partitions WHERE TABLE_SCHEMA = schema() AND TABLE_NAME='表名';
六、查看查询语句涉及分区信息
explain partitions select … from 表名 where …;
相关文章
- mysql中如何查看某个日期所在的周一是几号?某个日期所在的一周开始时间是几号?
- 连接MySql报错Unable to load authentication plugin 'caching_sha2_password'
- 【MySQL高级】MySql中常用工具及Mysql 日志
- MySQL数据库分表与分区
- 【JAVA】JSP操作数据库简单实例和mysql-connector-java-5.0.3-bin.jar项目配置方法
- CentOS 7离线安装MySQL 5.7
- 玩转MySQL表之间的各种连接查询
- 【收藏】mysql状态监控_mysql 状态监控
- 怎么查看mysql的数据库编码格式
- MySQL基础之 AUTO_INCREMENT
- MySQL 时间类型 date、datetime 和 timestamp 的用法与区别
- 原来用 MySQL 也可以做全文检索
- Qt 连接MySQL数据库(很多相关文章)
- mysql增删改查json中的某个字段
- Mysql数据按天分区,定期删除
- MySQL事件调度器Event Scheduler
- MySQL与OLAP:分析型SQL查询最佳实践探索
- mysql表分区,mysql分区表
- mysql日志文件开启及详解:General_log 和 Binlog
- mysql按照首字母排序
- mysql数据库表设计小数类型