使用大量数据优化SQL查询

时间:2016-09-13 09:08:27

标签: mysql sql optimization query-optimization

首先要做的事情是:我已经找到了类似的问题,但没有找到任何解释为什么我所做的事情是不好的做法,因此我发布了一个新问题,即使这是非常基本的问题。

我收到的投诉是我对数据库施加过多压力,但我无法弄清楚如何优化,所以我在这里寻求帮助。

我附上了我在底部处理的结构图。我想要做的是以下内容: 我需要获取已执行特定userAction的人员列表(假设' viewProduct'然后添加有关其userAge,country和continent的人员信息。

我写了以下内容:

select  u.userId, u.userAge, c.countryName, co.name, ul.createdTime,
        ul.userAction
    from  user_log as ul
    left join  user as u  ON u.userId = ul.userId
    left join  country as c  ON c.id = u.userCountryId
    left join  continent as co  ON co.id = c.continentId
    where  ul.createdTime > '2016-06-01'
      and  u.userAge > 40
      and  (ul.userAction like 'viewProduct'
              or  ul.userAction like 'storeProduct'
              or  ul.userAction like 'addProduct'
           );

这显然不够好,所以我真诚地希望有人能够帮助我们提高效率。我不习惯处理条目数以亿计的表格。

提前谢谢!

db structure

1 个答案:

答案 0 :(得分:0)

查询中有几个问题:

  1. 如果您没有限制且没有索引--MySQL将检查user_log中的所有100000000条记录以提供结果。要减少已处理记录的数量,请将索引添加到" ul.createdTime"以及" ul.userAction"。这甚至可以通过组合索引(createdTime,userAction)。
  2. " ul.userAction like' viewProduct'"等于" ul.userAction =' viewProduct'"。整个构造可以重构为(' viewProduct',' storeProduct',' addProduct')"
  3. 移动" u.userAge> 40"加入条件。并指出" u.userAge"会有很大的帮助。
  4. 我不确定,这取决于你的数据,但有时候"内部加入用户为你"可以更快地工作然后"离开加入用户作为你"。所以,你可以在这里玩。 (但是查询的逻辑将被更改)
  5. 向具有100000000条记录的表添加索引是一项长期任务。因此,出于测试目的,我会制作一份" user_log"仅限最后1000000条记录并测量其性能。然后我会添加所有提到的索引并测试此查询:

    select u.userId, u.userAge, c.countryName, co.name, ul.createdTime,     ul.userAction 
    from user_log as ul
    left join user as u
        on u.userId = ul.userId and u.userAge > 40
    left join country as c
        on c.id = u.userCountryId
    left join continent as co
    on co.id = c.continentId
    where ul.createdTime > '2016-06-01' and 
    ul.userAction in('viewProduct', 'storeProduct', 'addProduct');
    

    ..并比较表现。

    请告诉我们,这对您有帮助吗?