我需要有关如何简化/改进mysql中的排序模型的建议

时间:2010-09-24 20:08:02

标签: mysql

我想知道是否可以简化以下过程:我想根据以下标准将游戏标记为发送给客户:(如果您熟悉Netflix,则相当于他们的电影队列。)

  1. 他们在家里玩了多少场比赛。
  2. 他们在结算月份共收到了多少游戏。
  3. 我有一个表格,用于存储名为wishlists的客户选择(他们的游戏队列)。我正在使用以下查询自动为新插入的记录排名(排名决定了发货的优先级):

    schema (id, memberId, gameId, rank, markedForShipment, shippedOn, returnedOn)
    
            INSERT INTO wishlists (memberId, gameId, rank, markedForShipment)
            SELECT  @memberId, @gameId, COALESCE(MAX(rank), 0) + 1, 0, null, null
            FROM    wishlists
            WHERE   wishlists.memberId = @memberId
    

    我希望根据以下两个条件自动将“markedForShipment”填充为0或1:1. How many games a member has already received this month2. how many games a member currently has at home

    目前,我在每次插入后都会执行以下操作:

    1. 从计划表(shipmentPerMonthLimit和gamesAtHomeLimit)中获取计划限制。

    2. 了解会员本月有多少货件(shipmentCount

          SELECT COUNT(shippedOn) AS shipmentCount
          FROM wishlists
          INNER JOIN members ON wishlists.memberId = members.id
          WHERE wishlists.memberId = @memberId
          AND wishlists.shippedOn >= members.billingCycleStart
          AND wishlists.shippedOn < DATE_ADD(members.billingCycleStart, INTERVAL 1 MONTH)
      
    3. 了解会员有多少gamesAtHome

          SELECT COUNT(shippedOn) AS gamesAtHome
          FROM wishlists
          WHERE memberId = @memberId AND shippedOn IS NOT NULL AND returnedOn IS NULL
      
    4. 了解会员的排队货件(markedForShippment)有多少

          SELECT COUNT(markedForShippment) AS queuedShipments
          FROM wishlists
          WHERE memberId = @memberId AND markedForShipping = 1
      
    5. 检查游戏是否为库存。

    6. 如果满足以下所有条件,我通过设置markedForShipping to 1来更新新插入的记录。

      gamesAtHome is < than gamesAtHomeLimit
      shipmentCount is < than shipmentsPerMonthLimit
      queuedShipments is < gamesAtHomeLimit
      

      如何改进此流程?我可以简化吗?我要问这些问题,考虑到性能可能是最重要的因素。 4。

1 个答案:

答案 0 :(得分:1)

对我来说效率很高(我想你使用索引和外键)。除非你确实遇到性能问题,否则我的建议不是优化。

我认为优化这一点的唯一方法是引入冗余。例如,您可以将“shippingLimitReached”和“gamesAtHomeLimitReached”添加到成员表中。如果许多用户达到了他们的限制(并且可能是愿望列表很长的用户),您可以保存一些SELECT。