我有一些较长的查询,可以创建视图来简化查询,但我正在读取的底层数据库已更改为只读。当然,视图不再被创建,但我害怕巨大的重构以及这些select语句在没有它的情况下的样子。我是不是漏掉了什么明显的东西?
发布于 2020-06-02 19:03:51
如果你使用的是MySQL 8,你可以通过使用CTE来做一些重构,例如,你可以这样做
with tmp_a as (select id from table_a),
tmp_b as (select id from tmp_a)
select * from tmp_a a join tmp_b b on a.id = b.id这将允许您保持基本的代码结构,而不需要太多的工作,并且与当前代码一样具有描述性。
在CTE之前,您只需将视图的代码复制并粘贴到使用视图的任何位置。当MySQL运行您的查询时,它实际上执行完全相同的操作,但是如果您多次使用视图或大量嵌套,它看起来可能不像CTE那样干净。但是重构仍然仅限于复制和粘贴。
为了使用实际视图更接近您的当前情况,并且可能需要最少的重构,您可以将视图替换为临时表,这在只读数据库中是允许的:
create view tmp_a as select id from table_a变成了
create temporary table tmp_a as select id from table_a这有一个限制,即您不能在查询中多次使用这样的临时表(例如,在from/join中),因此您可能必须检查这种情况是否会发生,在这种情况下,您可能必须多次创建临时表(这可能会增加您的内存需求)。除此之外,除了临时表只能在创建临时表的会话中访问之外,您还可以像使用视图一样使用临时表,并且临时表将随会话一起消失。
如果你在一个只读从数据库(而不是静态数据库)上,如果你使用几个基表(例如,不从“view1”生成"view2“),你可能还必须确保你在一个事务中。与基于视图的单个查询(合并到一个大查询中)相比,临时表可能表示不同的时间。
另一种获取实际视图的方法是在服务器上添加一个非只读的虚拟数据库,在该服务器上创建视图并访问其他数据库。
create view tmp_a as select id from ro_db.table_a您需要调整查询以引用正确的数据库,当然还必须设置数据库和权限。
https://stackoverflow.com/questions/62148464
复制相似问题