我有一个奇怪的,我不知道这是我的语法(看起来很简单)还是一个错误(或者只是不受支持)。
这是我的查询有效但不必要的慢:
UPDATE table1
SET table1column1 =
(SELECT COUNT(DISTINCT table2column1) FROM table2view WHERE table2column1 <= (SELECT table2column1 FROM table2 WHERE table2.id = table1.id) )
/
(SELECT COUNT(DISTINCT table2column1) FROM table2)
+ (SELECT COUNT(DISTINCT table2column2) FROM table2view WHERE table2column2 <= (SELECT table2column2 FROM table2 WHERE table2.id = table1.id) )
/
(SELECT COUNT(DISTINCT table2column2) FROM table2)
+ (SELECT COUNT(DISTINCT table2column3) FROM table2view WHERE table2column3 <= (SELECT table2column3 FROM table2 WHERE table2.id = table1.id) )
/ (SELECT COUNT(DISTINCT table2column3) FROM table2);
它只是删除重复项的三个百分位数(table2column1、table2column2 和 table2column3)的总和。
这就是它变得奇怪的地方。我必须为此使用一个视图来处理子查询,WHERE
否则它只会UPDATE
显示 的第一行table1
,并将其余行设置table1column1
为0
。那table2view
是table2
. 是的,很奇怪。
如果我不使用DISTINCT
,我可以在没有视图的情况下做到这一点。那有意义吗? 注意:我必须有,DISTINCT
因为我有很多重复项。
我试着SELECT
只从视图中制作它,但这减慢了它的速度。
有谁知道问题是什么以及返工这个查询的最佳方法,所以它不需要这么长时间?它在 aTRIGGER
中,并且更新的数据非常按需。
提前谢谢了!
细节
我正在 phpMyAdmin 的命令行中测试速度。
我很确定降级来自视图,因为视图越多,我使用的实际表越少,它变得越慢。
当我做一个没有DISTINCT
的时候,它的速度很快。
仅适用于视图?
好的,所以我只是设置了table2
. 我首先尝试执行原始查询,用副本替换视图。不去。
我尝试使用副本而不是视图来执行以下查询。不去。
希望这些常量的引入能更好地展示我正在尝试做的事情。
SET @table2column1_distinct_count = (SELECT COUNT(DISTINCT table2column1) FROM table2);
SET @table2column2_distinct_count = (SELECT COUNT(DISTINCT table2column2) FROM table2);
SET @table2column3_distinct_count = (SELECT COUNT(DISTINCT table2column3) FROM table2);
UPDATE table1, table2
SET table1.table1column1 = (SELECT COUNT(DISTINCT table2column1) FROM table2view WHERE table2column1 <= table2.table2column1) / @table2column1_distinct_count
+ (SELECT COUNT(DISTINCT table2column2) FROM table2view WHERE table2column2 <= table2.table2column2) / @table2column2_distinct_count
+ (SELECT COUNT(DISTINCT table2column3) FROM table2view WHERE table2column3 <= table2.table2column3) / @table2column3_distinct_count
WHERE table1.id = table2.id;
同样,当我使用table2
而不是 时table2view
,它只会正确更新第一行并设置所有其他行的 table1.table1column1 = 0
。
数学
我正在尝试将= 设置为、和bytable1.table1column1
的百分位数之和。table2column1
table2column2
table2column3
id
我通过(计算 a table2columnX
<= 到 current的不同值)/(不同stable2columnX
的总数)来做一个百分位数。table2columnX
我DISTINCT
用来摆脱过多的重复。
看法
这是SELECT
视图。这有帮助吗?
CREATE VIEW myTable.table2view AS SELECT
table2.table2column1 AS table2column1,
table2.table2column2 AS table2column2,
table2.table2column2 AS table2column3,
FROM table2
GROUP BY table2.id;
GROUP BY
视图中是否有什么特别之处SELECT
可以使这项工作(我没有看到)?