我有一个与级联拥有的非定向 OneToMany 关系父级。
我想知道是否有一种方法可以优化 ORM 在插入、更新或删除时所做的请求。我知道如何配置批处理,但我看到了其他改进方式,ORM 正在执行的许多请求可以在单个查询中完成。
例如,考虑以下操作entityManager.persist(parent):
0 ms|statement|insert into parent (value) values (1)
0 ms|statement|insert into child (value) values (1)
0 ms|statement|insert into child (value) values (1)
3 ms|statement|insert into child (value) values (1)
0 ms|statement|update child set parent_id=1 where id=1
0 ms|statement|update child set parent_id=1 where id=2
0 ms|statement|update child set parent_id=1 where id=3
Run Code Online (Sandbox Code Playgroud)
可以替换为(至少对于 mysql 方言):
insert into parent (value) values (1);
insert into child (value) values (1),(1),(1);
update child set parent_id=1 where id …Run Code Online (Sandbox Code Playgroud) cassandra 新手,仍在学习中。
create table url (
id_website int,
url varchar,
data varchar,
primary key(url, id_website)
);
Run Code Online (Sandbox Code Playgroud)
嗨,我有一个网站的网址表。
我不希望所有 url 都在同一个节点上,这就是为什么主键首先是 url,所以它将是分区键。
大多数情况下,我将检索特定 url 的数据,例如:“url = ? 和 id_website = ?”
但是,当我想检索网站的部分/所有 url 时,性能如何:
select * from url where id_website = 1 allow filtering limit XX;
Run Code Online (Sandbox Code Playgroud)
我认为此查询将在所有节点上分派,然后对 id_website=1 进行表扫描,直到达到限制,然后合并并发回我的客户端。
但是这种扫描是使用索引并有效还是一一读取 id_website 列的值并进行比较(无效)?我确实设置了主键的 id_website 部分,所以我希望它被索引,但我真的不知道。
我们是否在 cassandra 上有一些工具,比如 mysql 的 EXPLAIN 来检查查询是否使用索引。
谢谢。
——
以 id_website 作为分区键创建第二个表(并批量写入/删除)
我不想使用这个解决方案,因为我可能有一个或两个非常庞大的网站,并且有数百万个网址(还有数百万个网址很少的其他网站)。
如果我在 id_website 上有一个分区键,并且这两个或三个网站停留在同一个节点上,则可能会导致存储问题,或者处理这些网站的节点可能被请求过多而其他网站一无所获。我想将数据传播到所有节点。这就是为什么我坚持要在 url 上进行分区。
您在 id_website 上创建二级索引(它为您创建一个表)
这个解决方案怎么样?如果我理解,每个节点都会有一个表索引它基于 id_website 存储的行(所以不是其他节点的行)。所以我可以将我的 url 分布在许多节点上,我不会让一个节点处理包含特定网站的所有 …