无法对这个mysql表进行分区

时间:2016-09-17 08:04:57

标签: mysql innodb database-partitioning

我有一个名为“transaction”的innoDB表,行数约为150万行。我想对这个表进行分区(可能在“gas_station_id”列上,因为它在连接查询中被大量使用)但是我在MySQL 5.7 Reference Manual中读到了

  

表的分区表达式中使用的所有列必须是表可能具有的每个唯一键的一部分,包括任何主键。

我有两个问题:

  1. 列“gas_station_id”不是唯一键或主键的一部分。我怎么能把这个表分区呢?
  2. 即使我可以对此表进行分区,我也不确定在这种情况下哪种分区类型会更好? (我在考虑LIST分区(我们有大约40个不同的(不同的)加油站),但我不确定,因为每个列表分区中只有一个值,如下所示: ALTER TABLE transaction PARTITION BY LIST(gas_station_id) ( PARTITION p1 VALUES IN (9001), PARTITION p2 VALUES IN (9002),.....
  3. 我尝试按KEY进行分区,但收到以下错误(我认为因为id不是所有唯一键的一部分..):
  4.   

    #1053 - UNIQUE INDEX必须包含表格分区函数中的所有列

    这是“交易”表的结构:

    enter image description here

    修改 这就是SHOW CREATE TABLE显示的内容:

    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
    

1 个答案:

答案 0 :(得分:1)

简答:不要使用PARTITION。让我们看一下查询来帮助加快速度。

答案很长:

  • 1.5M行仅略微大于考虑分区。
  • PARISTION BY LIST可能对性能无用。
  • 您没有提供足够的信息来为您提供其他模糊提示的答案。请至少提供SHOW CREATE TABLE和慢SELECT
  • 可以将分区键添加到PRIMARYUNIQUE键的末尾;你将失去唯一性测试。
  • 不要索引低基数列;它不会被使用。

More on PARTITION