0

我正在使用 Mysql 5.6,在事务表(InnodB)中有大约 1.5 亿条记录。随着大小的增加,这个表变得难以管理(添加列或索引)并且即使需要索引也很慢。通过互联网搜索后,我发现现在是对表进行分区的合适时间。我相信分区将为我解决以下目的

  1. 提高 DML 语句响应时间(使用分区修剪)
  2. 改进归档流程

但我不确定它是否(以及如何)会提高该表的 DDL 性能。更具体地说,遵循 DDL 的表现。

  1. 更改表添加/删除列
  2. 更改表添加/删除索引

我浏览了 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

And I am partitioning using following statement.

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)

Thanks!

4

1 回答 1

3

分区不是性能的灵丹妙药。即使你提到的项目也不会加速;他们甚至可能放慢速度。

相反,我将批评该表以寻找加快某些事情的方法。

  • 一旦 UUID 上的索引变得太大而无法缓存,UUID 的性能就会变得很糟糕。这是因为它的随机性。可能的解决方案:将其压缩为BINARY(16); 以其他方式缩小表格;避免使用 UUID。
  • 为什么两者都有parent_idparent_uuid??
  • 在可行的情况下将 4 字节缩小INTs为更小的数据类型。
  • 通常CHAR应该是CHARACTER SET ascii(1 字节/字符),而不是utf8mb4(4 字节/字符)。
  • 警告:150M 正在远程接近 20 亿的限制INT SIGNED。考虑 4B 的限制INT UNSIGNED。(每个为 4 个字节。)
  • 你用过created_atorupdated_at吗?
  • MySQL 8.0.13 有一个非常快的ADD COLUMNDROP COLUMN(对于有限的情况)。
  • 5.7.?? 比以前的版本侵入性更小ADD INDEX,但我不确定它是否适用于分区表。
  • 5.7.4:在线 DDL支持减少了表重建时间并允许并发 DML,这有助于减少用户应用程序的停机时间。有关其他信息,请参阅Online DDL 概述

更重要的是,让我们看看“太慢”的主要查询。可能有复合索引和/或查询的重新表述,这将加快它们的速度。

分区可能会有所帮助,但对PRIMARY KEY.

我认为只有 4 个用例分区有助于提高性能。

于 2018-12-05T01:04:52.003 回答