【问题标题】:MySQL CLAUSE can become a value?MySQL CLAUSE 可以变成值吗?
【发布时间】:2016-04-26 21:50:48
【问题描述】:

我是 mysql 的新手。我要做的是创建一个新表,它是原始 table 的副本,在特定条件下还有一列。哪个条件显示为新列就是新表。我的意思是:

table 是给定点 (x,y) 的序列 我想创建表 temp 是 (x,y,r) 其中 r = x^ 2 + y^2

CREATE temp LIKE table;
ALTER TABLE temp ADD r FLOAT;

INSERT INTO temp (x,y) SELECT * FROM table WHERE x*x+y*y<1;
UPDATE temp SET r=x*x+y*y;

没关系,它给出了我想要的,但是我的数据库比这个简单的例子大得多,在这里我计算了两个表中半径 r 的两倍。优化不是很好。

有没有办法将子句直接传递到新列中?

提前致谢。

【问题讨论】:

  • 为什么不创建一个视图呢?这样r 就会在您使用视图时计算
  • 视图未在 MySQL 中实现。因此,每次访问“表”(由视图定义)时,查询都会被执行——相当慢......
  • @Benvorth 拥有一个几乎完全冗余的表会更好吗?
  • 如果性能是一个问题:是的。
  • 解释性能损失超过维护损失?请参阅@TomH 答案。得到我的投票!

标签: mysql sql database optimization


【解决方案1】:

您应该(几乎)永远不要将计算数据存储在数据库中。当计算的值最终与计算它们的值不同步时,它最终会造成维护和应用程序的噩梦。

此时您可能对自己说:“好吧,我会做得非常好,让它们保持同步。”没关系,因为在某些时候,无论出于何种原因,它们都会不同步。

幸运的是,SQL 提供了一种很好的机制来处理您想要的 - 视图。

CREATE VIEW temp
AS
    SELECT
        x,
        y,
        x*x + y*y AS r
    FROM My_Table
    WHERE
        x*x + y*y < 1

【讨论】:

  • 非常感谢!我不知道 VIEW(我是 mysql 中的菜鸟),但它似乎完全符合我的要求,而且你的方法效果很好!我只是将 las 语句“WHERE xx+yy
【解决方案2】:

您实际上不必担心计算两次。执行insertupdate 的开销更大。因此,您应该同时进行这些计算。

MySQL 扩展了having 子句的使用,所以这很简单:

CREATE temp LIKE table;
ALTER TABLE temp ADD r FLOAT;

INSERT INTO temp(x, y, r)
    SELECT x, y, x*x+y*y as r
    FROM table 
    HAVING r < 1;

很可能实际上不需要额外的表,但这取决于您使用数据的方式。例如,如果您的处理相当复杂,并且多次引用temp,并且temp 比原始数据小,那么这可能是一个有用的优化。

此外,在表中实现计算不仅可以节省时间(当计算成本很高时,事实并非如此),而且它还允许在计算值上建立索引——这是在 MySQL 中无法做到的。

就个人而言,我更喜欢更复杂的查询,而不是大量的临时表。与许多极端的事情一样,最好的解决方案通常在中间(嗯,不是真的在中间,但临时表也不是全是坏的)。

【讨论】:

  • 非常感谢!正如上面在我的 cmets 中提到的,我使用 VIEW 方法与 HAVING 结合使用它可以正常工作。确实我不需要一个真正的临时表......我会考虑这个。
【解决方案3】:

而不是:

INSERT INTO temp (x,y) SELECT * FROM table WHERE x*x+y*y<1;
UPDATE temp SET r=x*x+y*y;

试试这个:

INSERT INTO temp (x,y,r) 
SELECT  x, 
       y, 
       x*x+y*y AS r  
FROM table 
WHERE x*x+y*y<1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 2019-12-20
    相关资源
    最近更新 更多