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

标签 mysql sql query-optimization

我有表 33_PROBLEM,其中包含 ROOT 和 ROOT_CUBED 列。十我有一个简单的过程,插入数据,让我们从-10000到10000的ROOT开始,这意味着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 服务器...

<小时/>

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

<小时/>

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

最佳答案

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

关于mysql - SQL - 查询优化以处理大数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38207078/

相关文章:

MySQL - SELECT 中的 IF

mysql - 坚持使用 MySQL 查询

hadoop - 在大型 (50 GB) 数据集上,没有 Partition BY 子句的 Hive 窗口函数 ROW_NUMBER 非常慢。有没有更好的优化方法?

mysql - 根据mysql中时区的当前时间排序

mysql - 我不确定我是否有正确的索引或者我是否可以提高我在 MySQL 中的查询速度?

mysql - 需要帮助优化 mysql 的纬度/经度地理搜索

php - 如何在 MySQL 中忽略表和更改 ID?

php - 有没有办法判断表/行是否涉及不同 session 的事务?

mysql - Sphinx 按第一个字母匹配

mysql - 一次更新所有列mysql