【发布时间】:2019-05-06 01:50:46
【问题描述】:
我正在使用 Mysql 5.6,在事务表 (InnodB) 中有大约 1.5 亿条记录。随着大小的增加,这个表变得难以管理(添加列或索引)并且即使需要索引也很慢。通过互联网搜索后,我发现现在是对表进行分区的合适时间。我相信分区将为我解决以下目的
- 提高 DML 语句响应时间(使用分区修剪)
- 改进归档过程
但我不确定它是否(以及如何)提高该表的 DDL 性能。更具体地关注 DDL 的表现。
- 更改表添加/删除列
- 更改表添加/删除索引
我浏览了 Mysql 文档和互联网,但找不到我的答案。谁能帮助我或为此提供任何相关文件。
我的表结构如下
CREATE TABLE `TRANSACTION` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
`parent_uuid` char(36) DEFAULT NULL,
`order_number` varchar(64) DEFAULT NULL,
`order_id` int(11) DEFAULT NULL,
`order_uuid` char(36) DEFAULT NULL,
`order_type` char(1) DEFAULT NULL,
`business_id` int(11) DEFAULT NULL,
`store_id` int(11) DEFAULT NULL,
`store_device_id` int(11) DEFAULT NULL,
`source` char(1) DEFAULT NULL COMMENT 'instore, online, order_ahead, etc',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`flags` int(11) DEFAULT NULL,
`customer_lang` char(2) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`),
KEY `business_id` (`business_id`,`store_id`,`store_device_id`),
KEY `parent_uuid` (`parent_uuid`),
KEY `order_uuid` (`order_uuid`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
我正在使用以下语句进行分区。
ALTER TABLE TRANSACTION PARTITION BY RANGE (id)
(PARTITION p0 VALUES LESS THAN (5000000) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN (10000000) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN MAXVALUE ENGINE = InnoDB)
谢谢!
【问题讨论】:
-
什么表引擎,因为 InnoDB 支持在线 DLL....此外,分区并不是总能解决性能问题的灵丹妙药。有些分区类型比其他分区类型更适合,所以这取决于哪种类型您需要.. 您应该分享
SHOW CREATE TABLE table声明和示例,然后我们才能提出建议或提供建议,您想如何或在哪个列上使用分区。 -
@RaymondNijland 感谢您的回复,我更新了问题中的表架构和分区语句。
标签: mysql database database-design ddl dml