无法对此mysql表进行分区
我有一个名为“transaction”的innoDB表,大约有150万行。我想对这个表进行分区(可能在“gas\u station\u id”列上,因为它在连接查询中经常使用),但我已经读过了 表的分区表达式中使用的所有列必须是表可能具有的每个唯一键(包括任何主键)的一部分 我有两个问题:无法对此mysql表进行分区,mysql,innodb,database-partitioning,Mysql,Innodb,Database Partitioning,我有一个名为“transaction”的innoDB表,大约有150万行。我想对这个表进行分区(可能在“gas\u station\u id”列上,因为它在连接查询中经常使用),但我已经读过了 表的分区表达式中使用的所有列必须是表可能具有的每个唯一键(包括任何主键)的一部分 我有两个问题: “加油站id”列不是唯一键或主键的一部分。那么我如何划分这个表呢 即使我可以对这个表进行分区,我也不确定在这种情况下哪种分区类型更好?(我在考虑列表分区(我们有大约40个不同的加油站),但我不确定,因为每个列
altertable事务
按列表划分(加油站id)
(9001)中的分区p1值,
(9002)中的分区p2值
键进行分区,但收到以下错误(我认为是因为id不是所有唯一键的一部分):
CREATE TABLE `transaction` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`terminal_transaction_id` int(11) NOT NULL,
`fuel_terminal_id` int(11) NOT NULL,
`fuel_terminal_serial` int(11) NOT NULL,
`xboard_id` int(11) NOT NULL,
`gas_station_id` int(11) NOT NULL,
`operator_id` varchar(16) NOT NULL,
`shift_id` int(11) NOT NULL,
`xboard_total_counter` int(11) NOT NULL,
`fuel_type` tinyint(2) NOT NULL,
`start_fuel_time` int(11) NOT NULL,
`end_fuel_time` int(11) DEFAULT NULL,
`preset_amount` int(11) NOT NULL,
`actual_amount` int(11) DEFAULT NULL,
`fuel_cost` int(11) DEFAULT NULL,
`payment_cost` int(11) DEFAULT NULL,
`purchase_type` int(11) NOT NULL,
`payment_ref_id` text,
`unit_fuel_price` int(11) NOT NULL,
`fuel_status_id` int(11) DEFAULT NULL,
`fuel_mode_id` int(11) NOT NULL,
`payment_result` int(11) NOT NULL,
`card_pan` varchar(20) DEFAULT NULL,
`state` int(11) DEFAULT NULL,
`totalizer` int(11) NOT NULL DEFAULT '0',
`shift_start_time` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `terminal_transaction_id` (`terminal_transaction_id`,`fuel_terminal_id`,`start_fuel_time`) USING BTREE,
KEY `start_fuel_time_idx` (`start_fuel_time`),
KEY `fuel_terminal_idx` (`fuel_terminal_id`),
KEY `xboard_idx` (`xboard_id`),
KEY `gas_station_id` (`gas_station_id`) USING BTREE,
KEY `purchase_type` (`purchase_type`) USING BTREE,
KEY `shift_start_time` (`shift_start_time`) USING BTREE,
KEY `fuel_type` (`fuel_type`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1665335 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT
简短回答:不要使用分区。让我们看看查询,以帮助加快它 长答覆:
-
<Li>1.5 m行只需稍大即可考虑分区。
- 按列表分区可能对性能毫无用处
- 您没有提供足够的信息,无法给出模糊提示以外的答案。请至少提供
和慢速SHOW CREATE TABLE
SELECT
- 可以将分区键添加到
或主
键的末尾;您将丢失唯一性测试唯一
- 不要为低基数列编制索引;它不会被使用
谢谢Rick的帮助。我编辑了我的问题并添加了
SHOW CREATE TABLE
。实际上目前事务表有150万行。我们将有更多记录的类似表(大约10亿行)。我增加了innodb_buffer_pool_size,现在查询速度更快了,但我不确定仅更改此变量是否足以满足我们在不久的将来拥有的更大的表。这就是我考虑分区此表的原因。buffer_pool是性能的一个重要因素;它应该是70%的可用RAM。无法判断查询是否会在没有看到查询的情况下运行得更快。感谢您的回答。现在所有查询都很快(只需增加缓冲池)。您认为即使此表有10亿行,我们可能不需要仅在增加缓冲池的情况下进行分区吗(我将其增加到可用RAM的约70%,即16G)分区本质上不提供任何加速。请参阅我的链接,了解分区有帮助的仅有4个用例。如果该表有10亿行,请小心。id INT SIGNED
限制在20亿行左右。其中许多INT
不需要是完整的4字节;将它们压缩到空间,从而提高可缓存性,因此速度更快。