如何像我们在 hive 中那样为每个 id 分区 MySQL 表
Posted
技术标签:
【中文标题】如何像我们在 hive 中那样为每个 id 分区 MySQL 表【英文标题】:How to partition MySQL table for every id just like we do in hive 【发布时间】:2021-10-18 10:00:47 【问题描述】:在我们的应用程序中,我们为每个查询构建一个唯一的查询 id,并根据该查询 id 插入到表中。 我们曾经为此使用 Hive,这很容易;
create table hivetable (
...
)PARTITIONED BY ( query_id INT ) ...
插入表格是这样的:
alter table hivetable add partition (query_id=?);
insert into hivetable partition(query_id=?) select ...;
现在我们正在迁移到 mysql,我很困惑。我尝试了下表并像这样插入:
create table mytable (...) PARTITION BY HASH(query_id);
insert into mysql values(?,?,...,<query_id>);
显然它没有按我想要的方式工作。它将所有 query_id 的数据插入到一个分区中。 所以我真的很感激一些帮助 谢谢
【问题讨论】:
我怀疑您是否需要在 MySQL 中进行分区。可以发一下原因吗? 您好,首先谢谢。除了插入之外,我们还为 query_id 选择并删除这些记录。所以我们需要这些操作高速运行。 如果是这样,请考虑 RANGE 分区,而不是 HASH。 没有任何好处,只是为此使用分区的复杂性。 【参考方案1】:最后,索引对我来说效果很好。我们想使用 Hive 分区之类的东西,因为要固定选择、删除操作。我发现 MySQL 中的索引非常符合我们的需求。如果你索引你使用 where 语句的列,它会很好地加快你的查询。您可以在以下链接中找到更多信息:https://dev.mysql.com/doc/refman/8.0/en/create-index.html
【讨论】:
正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:这里是关于如何使用Mysql Partitions 的文档。这是一个使用哈希的例子。
警告:如果不包含 PARTITIONS 子句,则分区数默认为 1。
CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT,
store_id INT
)
PARTITION BY HASH(store_id)
PARTITIONS 4;
【讨论】:
【参考方案3】:不要使用 MySQL 的 PARTITIONing
来执行此任务。只需将唯一的query_id
设为PRIMARY KEY
。然后INSERT tbl
或UPDATE tbl
或SELECT ... FROM tbl
,视情况而定。
【讨论】:
以上是关于如何像我们在 hive 中那样为每个 id 分区 MySQL 表的主要内容,如果未能解决你的问题,请参考以下文章
如何与 partitionBy 或 InsertInto Hive 并行保存 Dataframe/Dataset 的每个分区