通过组合表来增加JOIN查询响应时间

时间:2016-04-09 23:19:53

标签: mysql sql join optimization lag

我们有一个体育购物网站,向用户推荐产品。我们的查询建议通过对具有以下效果的三个表进行JOIN:(1)用户感兴趣的运动,(2)该运动的哪些产品,以及(3)消除用户已经购买的产品。我们目前有三张桌子。响应时间为3秒。

为了使查询响应更快,我们建议将两个表合并到一个表中。附图显示了建议的逻辑。我的问题是:

  1. 是建议的查询,甚至可以作为单一查询
  2. 如果其他条件相同,建议的逻辑是否会比当前逻辑更快 - 即使数量很小?
  3. 我们在AWS MySQL RDS上。所有索引都已正确完成。请不要讨论有关迁移到Redis,MEMSql等的问题,我只是对这个阶段感兴趣,以了解所提出的逻辑是否会更快。

    感谢您的帮助!!

    Proposed Query Change

    创建

    CREATE TABLE UserPreferences (
        UserPreferenceId int(11) NOT NULL AUTO_INCREMENT, 
        UserId int(11) NOT NULL, 
        FamilyId int(11) NOT NULL, 
        InsertedDate datetime NOT NULL, 
        PRIMARY KEY (UserPreferenceId), 
        KEY userID (UserId), 
        KEY FamilyId (FamilyId), 
        KEY user (UserId), 
        KEY fk_UserPreferences_1 (FamilyId), 
    ) ENGINE=InnAoDB AUTO_INCREMENT=261 DEFAULT CHARSET=utf8
    CREATE TABLE ArticleToFamily (
        ArticleToFamilyId int(10) unsigned NOT NULL AUTO_INCREMENT, 
        ArticleId int(11) DEFAULT NULL, 
        FamilyId int(11) unsigned NOT NULL, 
        InsertedDate datetime DEFAULT NULL, 
        Confidence int(11) NOT NULL DEFAULT '0', 
        Rank int(11) NOT NULL DEFAULT '0', 
        PRIMARY KEY ArticleToFamilyId),
        KEY ArticleIdAndFamilyId` (ArticleId,FamilyId), 
        KEY FamilyId (FamilyId)
    ) ENGINE=InnoDB AUTO_INCREMENT=19795572 DEFAULT CHARSET=latin1
    CREATE TABLE ItemsUserHasBought (
        ItemsUserHasBoughtId int(11) NOT NULL AUTO_INCREMENT, 
        UserId int(11) NOT NULL, 
        ArticleId int(11) NOT NULL, 
        BuyDate datetime NOT NULL, 
        InsertedDate datetime NOT NULL, 
        UpdatedDate datetime NOT NULL, 
        Status char(1) NOT NULL DEFAULT '1', 
        PRIMARY KEY (ItemsUserHasBoughtId), 
        KEY ArticleId (ArticleId)
    ) ENGINE=InnoDB AUTO_INCREMENT=367 DEFAULT CHARSET=latin1
    

0 个答案:

没有答案