- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个巨大的 InnoDB 表(>1TB,>1B 行),我想对其进行分片:我想从那个大表中创建多个较小的独立表。
怎么做?
我已经尝试过的:
随机的疯狂想法:
.idb
文件,并将其导入服务器,但我不知道是否存在能够执行此操作的工具。显示创建表:
CREATE TABLE `Huge` (
`account_id` int(11) NOT NULL,
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`foo` varchar(255) NOT NULL,
`bar` int(11) NOT NULL,
`baz` char(2) NOT NULL,
PRIMARY KEY (`account_id`,`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;
分片键为 account_id。主键当前为 (account_id,id)
,因此行按 account_id
聚类。
是否有任何工具可以自动执行此任务?有更好的方法吗?
最佳答案
“分片”是将数据(通常是一张表)拆分到多个服务器。 “分区”是在同一 服务器上将一个表拆分为多个子表。你在做什么? Fabric 进行分片。您对 .ibd 的评论暗示您正在考虑分区。
假设您要PARTITION
一个巨大的表,我需要先问为什么。这是一个严肃的问题,因为大多数(我的意思是大多数)人认为分区会神奇地产生一些好处,而实际上它不会。我相信有only 4 use cases for partitioning .您的情况是否属于其中任何一个?
另一方面,如果您想要分片,请提供 SHOW CREATE TABLE
并讨论您将在哪个列上分片。
编辑(明确目标后)
我希望你没有明确的FOREIGN KEYs
;它们不适用于分区或分片。
`id` bigint(20) NOT NULL AUTO_INCREMENT,
UNIQUE KEY `id` (`id`)
有两个方面的问题。
不需要使id
UNIQUE
; AUTO_INCREMENT
的唯一要求是它是某个索引中的第一列。所以这会减轻系统的负担:
索引(id)
AUTO_INCREMENT
确实适用于PARTITIONed
表,但不适用于分片表。您需要评估 id
的用途。要么它只在一个分片内是唯一的就可以,那么就没有真正的问题。如果 id
需要在所有分片中都是唯一的,那就更难了。可能唯一的解决方案是拥有一种从某些中央服务器获取 ID 的技术。但是,这会导致单点故障和瓶颈。如果您需要朝那个方向发展,我可以就如何避免这些缺点提出建议。
如何迁移到最终的分片系统?
我不建议离题到 PARTITIONing
,从长远来看它不会真正有帮助。 REORGANIZE PARTITION
的成本很高——复制所有行,包括提取的行和剩余的行。 编辑:如果您确实使用了分区,请使用 pt-online-schema-change
以最短的停机时间进行拆分。
相反,我建议完善一种工具,将一个 account_id
从一个分片迁移到另一个分片。这必须是自定义代码,因为可能还有其他表(以及表之间的引用)会受到将帐户移动到不同服务器的影响。从长远来看,这对于负载平衡、硬件升级、软件升级,甚至模式更改都是有用的。当您需要更改某些内容时,使用新的操作系统/版本/模式/任何内容创建一个新的分片,并将用户迁移到它。
这个工具的简单方法是
DELETE
旧分片上的行如果帐户“小”,这不是什么大问题。但是,如果您需要最短的停机时间(写入受阻),那么我们可以讨论更复杂的方法。
(如果您没有猜到,我已经“去过那里,做过那件事”。)
关于mysql - 使用 MySQL/InnoDB 重新平衡表分片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31076437/
我已经在我的 windows7 机器上安装了 bugzilla4.2.5。当我运行 bugzilla 的 checksetup.pl 脚本时,它显示 Use of uninitialized valu
我正在使用 MySQL 5.1.56 我有一个包含大约 70 个表的数据库,我有一个特定损坏的表的问题,例如表_X 当我尝试访问表时mysql> 从 Table_x 中选择 *;ERROR 1105
我最近尝试将 MySQL 5.1 服务器升级到 5.7。当服务器无法启动时,我发现您必须先导出数据,然后再进行大量升级(二进制文件不再可用),所以我回滚到 5.1 进行导出。 问题是,回到 5.1,I
我正处于项目的开始阶段,到目前为止我一直在使用默认的 MySQL 数据库。 对了,默认的数据库有名字吗? 我的问题是如何在不删除当前表和创建新表的情况下将现有表更改为 utf-8 和 InnoDB。是
我最近尝试将 innodb 缓冲池大小增加到 8GB,但在我的 innodb 状态下,池大小看起来像之前配置的值(在我的例子中是 500MB)。 ---------------------- BUFF
我是一家网络酒店的幸运老板,店主会在不知情的情况下更改设置。当这么说时,我的数据库中有一些表正在使用 InnoDB 引擎运行。但是晚上主机禁用了 InnoDB,所以我无法使用 ALTER 命令将其转换
我刚刚将数据库从 MyISAM 引擎迁移到 InnoDB。我使用 mysqldump 备份我的 MyISAM 数据库,但是当我查看 MySQL docs ,对于 InnoDB 表,我还需要保存二进制文
环境: Windows 7(XAMPP 最新版) Apache 2.4.4PHP 5.5MySQL 5.6.11 我正在尝试从 MySQL 5.1 备份数据库并将其导入 MySQL 5.6。 在 My
我正在创建的应用程序主要使用选择,但也有一些是插入、更新等。我想知道在这些情况下哪种性能最好。 其次,当我在 innodb 中有两个相关的表时,如果它与另一个表中的行相关,我该如何删除它而不吐出错误?
我的意思是页面: https://dev.mysql.com/doc/internals/en/innodb-page-structure.html 这些 16KB 的 MySQL 页面会在内存或磁盘
以下是我使用 mysqldump 备份数据库的开关: /usr/bin/mysqldump -u **** --password=**** --single-transaction --databas
我阅读了本网站上的大部分 InnoDB 示例,但我对 InnoDB 的行为一无所知。 据我所知 START TRANSACTION; 声明这是一个事务连接。没关系到这里。现在我有 3 个表: 带有 I
我有一个包含混合表(MyISAM、InnoDB)的 MySQL 数据库。 如何通过 Linux 命令行使用 mysqldump 创建数据库的完整备份,我应该使用什么选项? 最佳答案 在下面使用- 所有
我有一张桌子:。我用Python在这个表中插入了大约400k行。以下是INSERT语句:。我在两个表tab1.col1和tab2.col2上都有一个索引。但是插入大约需要5分钟/1000行的时间。我从
我正在尝试使用 WAMP 在本地服务器上安装 Magento。 InnoDB 被设置为默认引擎,但它仍然向我显示消息: Database server does not support InnoDB
我最近将所有表从 MyISAM 移到了 InnoDB,因为我想摆脱大表上的表锁定。 在以下表上运行 UPDATE 或 INSERT 查询花费的时间比预期的要多很多。 (约 5 分钟) 我如何优化 in
我正在运行带有 XAMPP 的 Windows 10 和在本地主机上安装的几十个 Drupal 站点。几个月来一切都运行良好。 今天早上,我从两天前的还原点执行了 Windows 还原,以删除不需要的
Socialengine 4.8.6 - 启动时显示“白屏”,只能通过浏览器访问 sesystem.com/phpmyadmin 和 sesystem.com/install。 问题开始:我需要一个包
由于 InnoDB 在 B+ 树中组织其数据。树的高度影响 IO 次数,这可能是 DB 变慢的主要原因之一。 所以我的问题是如何断言或计算B+树的高度(例如根据可以通过行大小、页面大小和行号计算的页数
我尝试使用 mysqldump 从系统 A 使用 innodb 默认存储引擎将大约 40gb 的数据库 db1 转储到 sql 文件中,并尝试在另一个系统 B 上恢复它。两者都有默认存储引擎 inno
我是一名优秀的程序员,十分优秀!