我们对memsql / mysql很新,我们正在尝试使用memsql安装。
它安装在CentOS7虚拟机上,我们运行的是MemSQL版本5.1.0。
我们收到了我们正在尝试的其中一个查询的错误: ERROR 1889(HY000):错误的分布式连接计划:结果表分片键不匹配。请通过support@memsql.com联系MemSQL支持。
在我们的一个查询
上我们有两张桌子:
CREATE TABLE `MyObjects` (
`Id` INT NOT NULL AUTO_INCREMENT,
`Name` VARCHAR(128) NOT NULL,
`Description` VARCHAR(256) NULL,
`Boolean` BIT NOT NULL,
`Int8` TINYINT NOT NULL,
`Int16` SMALLINT NOT NULL,
`Int32` MEDIUMINT NOT NULL,
`Int64` INT NOT NULL,
`Float` DOUBLE NOT NULL,
`DateCreated` TIMESTAMP NOT NULL,
SHARD KEY (`Id`),
PRIMARY KEY (`Id`)
);
CREATE TABLE `MyObjectDetails` (
`MyObjectId` INT,
`Int32` MEDIUMINT NOT NULL,
SHARD KEY (`MyObjectId`),
INDEX (`MyObjectId`)
);
这是我们正在执行并获取错误的SQL。
memsql> SELECT mo.`Id`,mo.`Name`,mo.`Description`,mo.`Boolean`,mo.`Int8`,mo.`Int16`,
mo.`Int32`,mo.`Int64`,mo.`Float`,mo.`DateCreated`,mods.`MyObjectId`,
mods.`Int32` FROM
( SELECT
mo.`Id`,mo.`Name`,mo.`Description`,mo.`Boolean`,mo.`Int8`,
mo.`Int16`,mo.`Int32`,mo.`Int64`,mo.`Float`,mo.`DateCreated`
FROM `MyObjects` mo LIMIT 10 ) AS mo
LEFT JOIN `MyObjectDetails` mods ON mo.`Id` = mods.`MyObjectId` ORDER BY `Name` DESC;
ERROR 1889 (HY000): Bad distributed join plan: result table shard keys do not match. Please contact MemSQL support at support@memsql.com.
有谁知道我们收到此错误的原因,如果有可能的更改,我们可以帮助缓解此问题?
我们知道的一件事是它与内部选择有关,好像我把它拉出来并且它可以连接它,但是我们只从连接中获得10行。我们正在尝试从主表中获得前10名,并包括右侧的所有细节。
我们还尝试将MyObjectDetails表更改为具有空的SHARD KEY,但这导致了相同的错误。
SHARD KEY()
我们还在详细信息表中添加了一个自动递增Id列,并将该分片放在该列上,但仍然收到相同的错误。
提前感谢您的帮助。
我通过电子邮件联系了MemSQL(顺便提一下他们的客户服务很棒的道具 - 非常快的响应时间,不到几个小时)
但是从Mike所说的我把表改为REFERENCE表并删除了create table语句的SHARD KEY部分。一旦我这样做,我就能运行查询。我不是百分之百确定这会产生什么后果,但它解决了我的问题。感谢
CREATE REFERENCE TABLE `MyObjects` (
`Id` INT NOT NULL AUTO_INCREMENT,
`Name` VARCHAR(128) NOT NULL,
`Description` VARCHAR(256) NULL,
`Boolean` BIT NOT NULL,
`Int8` TINYINT NOT NULL,
`Int16` SMALLINT NOT NULL,
`Int32` MEDIUMINT NOT NULL,
`Int64` INT NOT NULL,
`Float` DOUBLE NOT NULL,
`DateCreated` TIMESTAMP NOT NULL,
PRIMARY KEY (`Id`)
);
答案 0 :(得分:1)
感谢Mike Gallegos对此进行调查,在此处添加了他的答案摘要:
这里的错误信息很糟糕,但错误的原因是MemSQL当前不支持分布式左连接,其中左侧(在这种情况下为Limit
子查询)具有LIMIT运算符。如果在连接后无法重写查询以执行限制,则可以将MyObjects
表更改为引用表以解决此问题。