我有一个奇怪的,我不知道这是我的语法(看起来很简单)还是一个错误(或者只是不受支持)。
这是我的查询有效但不必要的慢:
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的百分位数之和。table2column1table2column2table2column3id
我通过(计算 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可以使这项工作(我没有看到)?