Percona MySQL 8.0.15-5
大家好,你能帮我解决一个问题吗?
我想使用临时表将查询重写为使用'with‘的CTE。此查询应执行从一个表到另一个表的数据阻塞。
工作流程如下:我们选择一批数据,将其插入到目标表中,然后从这批数据中选择最大的id,存储它,当进一步调用过程时,数据的选择从这个id开始。
‘'with’非常适合这种情况,因为它不会创建临时表。我写了以下查询:
insert ignore quotes
(
time,
symbol,
server,
bid,
ask,
last,
volume
)
WITH temp AS
(
SELECT
q.id,
q.`time`,
q.symbol,
q.server,
q.bid,
q.ask,
q.last,
q.volume,
q.created_at
FROM
`old.quotes2` q
WHERE
q.id > id
ORDER BY
q.id asc
LIMIT
write_limit
), m AS (SELECT @max := MAX(t.id) max FROM temp t) -- m subclause not executed
SELECT
t.time,
`search_or_add_of_symbol_id_from_name`(t.symbol) symbol,
`search_of_server_id_from_name`(lower(t.server)) server,
t.bid,
t.ask,
t.last,
t.volume
FROM temp t
MySQL不执行名为m的第二个查询,可能是因为我以后不会使用它。为了解决这个问题,我必须向主'select‘添加一个额外的'join’条件。
可以强制MySQL执行'm‘子句吗?也许有什么提示会迫使优化器执行'm‘子句?
发布于 2019-04-15 02:35:19
尝试:
选项0:
INSERT ...
WITH
temp AS (...),
m AS (...)
SELECT ...
FROM temp JOIN m;
选项1:
INSERT ...
WITH
temp AS (...),
m AS (...)
SELECT ...
FROM temp, m;
选项2:
INSERT ...
WITH
temp AS (...)
SELECT ...
FROM temp, (...) m;
https://stackoverflow.com/questions/55673044
复制相似问题