2012-01-11 75 views
1

我的问题目前有点含糊,因为我不确定我应该在网上发布任何公司代码或任何东西。但是在这里。DELETE和INSERT相对于多个SELECT和UPDATE有多贵?

假设我需要更新MySQL数据库中的特定字段。为了使用我的Java客户端程序执行此操作,我必须使用多个SELECT语句来检查字段是否应该更新,然后使用已检索的信息对其进行适当更新。

例如。

//created a Connection called con already... 
PreparedStatement selectStatement = con.prepareStatement("SELECT * FROM myTable" /*+ etc*/); //example query only! I'm not actually going to use "SELECT * FROM myTable"! 
//more selectStatements follow 
PreparedStatement updateStatement = con.prepareStatement("UPDATE myTable SET field1 = ? WHERE id = ?"); 
ResultSet rs = selectStatement.executeQuery(); 
//more ResultSets from the other selectStatements 
//process ResultSets and retrieve information that indicates wwhether an update must take place 
if(conditionOccurred) { //Assuming we need to update 
    updateStatement.setText(...); 
    updateStatement.executeUpdate(); 
} 

(我还没有在代码中包含try-catch ES(对不起,我有点懒,因为这只是一个人为的例子),但我不得不抓住潜在SQLException S作为好,我猜...)

我想知道的是:如果我删除该行,然后插入一个包含所有更新信息的新行,它仍然会更加“昂贵”,或者在速度方面代价高昂我现在需要使用多个select语句来检查是否应该发生更新? (记忆目前并不是一个大问题,但是如果我所做的事情在这方面有很大的缺陷,我很乐意听到它!)

TL; DR:如果我在一些字段中使用多个SELECT语句,然后使用UPDATE,那么简单地DELETE然后INSERT一个新行会更有效吗?

额外的细节:我目前正在使用的表具有自动递增的ID,VARCHAR字段(要更新的字段,具有唯一性约束),2个日期字段和CHAR(64)字段。不知道它是否有助于回答问题,但无论如何我都会提供。

请让我知道是否有更多的细节,你需要,并提前感谢任何人可能提供一些见解。

回答

1

要完全回答您的问题,我们需要查看您的SELECT语句,但是如果您的UPDATE不更改主键值,我会认为UPDATE更有效。这背后的原因是,索引值不需要调整,如果索引是DELETE & INSERT的话。

在大多数情况下,唯一可靠的测试方法是使用标记时间的方法和基准。

+0

啊,好的。关于您需要进行基准测试的评论,我怀疑是这样。我没有想到你指出的索引问题。那么我假设,如果我在'VARCHAR'字段正在更新时放置唯一性约束,那么这对'UPDATE'会产生问题?我已经将这些信息添加到了原始文章中,对此抱歉。 – blahman 2012-01-11 04:52:10

+0

是的,这是正确的。 – 2012-01-11 05:18:35

+0

谢谢! – blahman 2012-01-11 05:28:17

1

我回答您基于从高级数据库管理课程获得的知识回答您的问题。我会说这将是非常主观的,因为你关心的是速度而不是记忆的使用。

检索完成后,根据您的Select语句,您的数据将被缓存,当需要任何必需的Update时,您可以直接编辑缓存中的字段。如果您正在执行DeleteInsert的后者,则会节省读写操作。

这将在我的理解中,为您节省一个单一事务的毫秒处理时间,并且如果您查看大图,在执行多个事务时将为您节省很多。但是,如果您的select语句涉及处理大量数据的查询过多,则可能会发现您的后一种方法效率更高。

我相信你的SQL语句的额外输入,我们将能够给你一个更好,更准确的建议。 :)我希望它有帮助。

+0

谢谢。不幸的是,我没有接触到数据库的高级数据库(内部),所以你的答案是非常有用的。再次谢谢你!正如我前面所说的,由于我不知道发布代码,我不得不放弃,但考虑到(我认为),我对每种方法的可行性有了更好的想法。 – blahman 2012-01-11 05:10:16

相关问题