SQL - 查询优化以处理大数据

时间:2016-07-05 15:15:57

标签: mysql sql query-optimization

我有表33_PROBLEM,其中包含ROOT和ROOT_CUBED列。我有一个简单的程序,插入数据,让我们从ROOT开始从-10000到10000,这意味着ROOT_CUBED从-10000 ^ 3到10000 ^ 3.

问题很简单: 如何获得ROOT_CUBED值的所有三元组组合,并将其添加到给定的数字?

以不同方式说: 我想找到A,B,C为真,即A ^ 3 + B ^ 3 + C ^ 3 = number_given

以下是搜索到的第33号的一些示例:

SELECT T1.r1, 
       T2.r2, 
       T3.r3 
FROM   (SELECT root_3 AS R1 
        FROM   `33_problem`) AS T1, 
       (SELECT root_3 AS R2 
        FROM   `33_problem`) AS T2, 
       (SELECT root_3 AS R3 
        FROM   `33_problem`) AS T3 
WHERE  T1.r1 + T2.r2 + T3.r3 = 33 

在少量行上运行良好。此查询使(COUNT *)^ 3行,20000输入行等于8e + 12行!! ...... RIP serever ......

解决这个问题的正确方法是什么?

(我从https://www.youtube.com/watch?v=wymmCdLdPvM得到了这个想法,我希望,当有人得到一些答案时,我会更好地理解,SQL如何工作以及如何设计查询和数据库以便即使对于大数据也能正常工作)< / p>

3 个答案:

答案 0 :(得分:0)

1)您可以尝试仅选择连续三元组,例如R1 <= R2 <= R3,

2)如果您有重复项,请选择不同的

SELECT T1.R1
  ,T2.R2
  ,T3.R3
FROM (
  SELECT DISTINCT ROOT_3 AS R1
  FROM `33_PROBLEM`
  ) AS T1
  ,(
    SELECT DISTINCT  ROOT_3 AS R2
    FROM `33_PROBLEM`
    WHERE R2>=R1
    ) AS T2
  ,(
    SELECT DISTINCT ROOT_3 AS R3
    FROM `33_PROBLEM`
    WHERE R3>=R2
    ) AS T3
WHERE T1.R1 + T2.R2 + T3.R3 = 33

答案 1 :(得分:0)

我尝试从-10000到10000寻找并且没有解决方案然后我看了youtube视频他们说他们已经尝试了10到14,仍然没有解决方案。

我用python代码做了,虽然当我尝试-10000到10000 ...并优化寻找C值。首先,我看一下A立方和B立方的总和...从33减去并计算立方根的答案,试图在一次击中找到C ...,这会稍微优化它,因为那样你就不会...必须循环遍历C的所有可能值。

由于没有最多10到14的解决方案我不认为我能找到解决方案,因为只需-10000到10000我的计算机花了2个多小时来搜索。如果我看到10到14,那就需要数百万年或者疯狂的事情。

答案 2 :(得分:0)

如果是整数,你可以使用单个表,然后使用“交叉连接”进行“自联接”。

对于R3,您只需要检查-ROUND(POW(r1.root_3 + r2.root3, 1/3))。这应该会大大加快速度。此外,为了使这项工作,请确保您有一个正数。

SELECT t1.r1, t2.r2, -ROUND(POW(r1.root_3 + r2.root3, 1/3))
    FROM `33_PROBLEM` AS t1
    JOIN `33_PROBLEM` AS t2
    WHERE t1.root_3 > 0
      AND t2.root_3 > -t1.root_3
      AND (t1.root_3 + t2.root_3) = ROUND(POW(r1.root_3 + r2.root3, 1/3))