无法分区此mysql表

摩纳

我有一个名为“ transaction”的innoDB表,具有约150万行。我想对该表进行分区(可能在“ gas_station_id”列上,因为它在联接查询中使用了很多),但是我在《MySQL 5.7参考手册》已经读到

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

我有两个问题:

  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并非所有唯一键的一部分。):

#1053-唯一索引必须在表的分区功能中包含所有列

这是“交易”表的结构:

在此处输入图片说明

编辑,这是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
里克·詹姆斯

简短答案:请勿使用PARTITION。让我们看一下查询,以帮助加快查询速度。

长答案:

  • 150万行仅足以考虑分区。
  • 按列表分区可能对性能没有用。
  • 您没有提供足够的信息来回答其他含糊的提示。请至少提供SHOW CREATE TABLE和慢SELECT
  • 可以将分区键添加到PRIMARYUNIQUE的末尾您将失去唯一性测试。
  • 不要索引低基数列;它不会被使用。

有关PARTITION的更多信息

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MySQL表按月分区

来自分类Dev

mysql-表分区与“手动”表分区

来自分类Dev

我无法访问NTFS分区:无法显示此位置

来自分类Dev

无法在SSD上创建分区表

来自分类Dev

Oracle表分区无法正常工作

来自分类Dev

您知道为什么mysql无法创建此表吗?

来自分类Dev

MYSQL分区避免完整扫描表

来自分类Dev

Firebird等同于MySQL表分区

来自分类Dev

大 MySQL 产品历史表分区?

来自分类Dev

MySQL:无法从特定分区中选择记录?

来自分类Dev

Ubuntu无法安装:无法使用gparted创建分区表

来自分类Dev

无法删除mysql表

来自分类Dev

无法创建mySQL表

来自分类Dev

无法插入MYSQL表

来自分类Dev

mySQL - 无法创建表

来自分类Dev

Hive:无法将数据从未分区表复制到分区表

来自分类Dev

如何在mysql中修剪此表?

来自分类Dev

插入Hive表-非分区表到分区表-由于列号/类型无法插入目标表

来自分类Dev

插入Hive表-未分区表到分区表-由于列号/类型无法插入目标表

来自分类Dev

MySQL分区表的工作速度比等效的未分区表慢

来自分类Dev

无法在MySQL中运行此WHILE LOOP

来自分类Dev

无法在Hive分区表中加载数据

来自分类Dev

Hive外部表无法读取已分区的hdfs目录

来自分类Dev

重写分区表后Windows 8无法启动

来自分类Dev

无法使用Slackware 14在SSD上创建分区表

来自分类Dev

无法识别两个分区表

来自分类Dev

分区表损坏,无法访问数据

来自分类Dev

更新启动分区表后无法启动到Windows

来自分类Dev

为什么partx无法读取某些磁盘的分区表