首先要做的事情是:我已经找到了类似的问题,但没有找到任何解释为什么我所做的事情是不好的做法,因此我发布了一个新问题,即使这是非常基本的问题。
我收到的投诉是我对数据库施加过多压力,但我无法弄清楚如何优化,所以我在这里寻求帮助。
我附上了我在底部处理的结构图。我想要做的是以下内容: 我需要获取已执行特定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'
);
这显然不够好,所以我真诚地希望有人能够帮助我们提高效率。我不习惯处理条目数以亿计的表格。
提前谢谢!
答案 0 :(得分:0)
查询中有几个问题:
向具有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');
..并比较表现。
请告诉我们,这对您有帮助吗?