更新的代价会高一点,特别是非MYISAMy引擎的。不过还有一个更好方案:
C:在向界面输出数据的时候,不查询isDisplay的值,用户勾选下次是否仍显示该数据时,
                     如果勾选“是”,就直接update数据表,设置isDisplay=1  where isDisplay=0
                     如果勾选“否”,就直接update数据表,设置isDisplay=0  where isDisplay=1;

解决方案 »

  1.   


    我觉得这个问题应该说包含了几个不同的技术问题:
    一个就是select的时候字段的多少对效率的影响,多select一个字段内存的消耗和速度的降低具体比率如何测算?
    另一个是update一次数据表、设置一个字段的值,其内存消耗和cpu占用是多少?然后就是B方案update数据表的几率对效率比较的影响。如果“多select一个字段”的系统消耗比“多update一次数据表”的系统消耗少一个或几个数量级,那么B方案update数据表的几率要大概在90%以上,方案A和方案B的效率总体效率才能相当。
    否则,如果几率是50%左右的话,方案A要比方案B差很多(因为假设100次的话,方案A要100次都要update数据表;方案B只需update 50次。虽然方案B每次都“多select一个字段”,但其消耗远小于50次的update数据表)。存储引擎的类型我不懂,但直觉上也是感觉直接更新数据表的代价更高。。
      

  2.   


    楼主说方案C更好的原理是什么?这个方案也是每次都要update数据表啊where语句有什么神奇之处?另外,这个问题是不是与每次是否关闭数据库连接也有关系?(因为数据库不关闭的话,直接update数据表的消耗还小一些,否则update前要做数据库连接的话,那消耗就更大了)
      

  3.   

    1、确实更新要花更多的代价
    假如是INNODB引擎,更新要建立事务,分2步骤走, 首先要写到一个buffer pool, 再由后台一个进程写到实际的表中
    如果是MYISAM引擎,代价会少点。2、update xxx sDisplay=1  where KEY=XXX AND isDisplay=0
    ---只有isDisplay原值等于0的情况下才更新为1。
    相当于你B方案的两个语句。到底会不会比B方案更省资源,还要测试一下3、是否关闭连接和update数据表的消耗没有必然的联系,假如用一次性连接,前面几个方案,都要打开连接、关闭连接。
      

  4.   

    1、确实更新要花更多的代价
    假如是INNODB引擎,更新要建立事务,分2步骤走, 首先要写到一个buffer pool, 再由后台一个进程写到实际的表中
    如果是MYISAM引擎,代价会少点。2、update xxx sDisplay=1  where KEY=XXX AND isDisplay=0
    ---只有isDisplay原值等于0的情况下才更新为1。
    相当于你B方案的两个语句。到底会不会比B方案更省资源,还要测试一下3、是否关闭连接和update数据表的消耗没有必然的联系,假如用一次性连接,前面几个方案,都要打开连接、关闭连接。C方案相当于B方案的两个语句,那应该比B方案更耗资源才对啊?兄台脑筋急转弯了吧?只要一执行update语句,就必然调用相关资源了,而不管后面wehere语句结果如何,对吧?