【发布时间】:2016-09-13 09:08:27
【问题描述】:
首先要做的事情:我已经寻找过类似的问题,但没有发现任何东西可以解释为什么我正在做的事情是不好的做法,所以我发布了一个新问题,即使这是非常基本的问题。
我收到投诉说我对我们的数据库施加了太大的压力,但我不知道如何优化,所以我在这里寻求帮助。
我在底部附上了我正在处理的结构的图片。我想要做的是以下几点: 我需要获取执行特定 userAction 的人员列表(比如说“viewProduct”,然后添加有关该人的用户年龄、国家和大陆的信息。
我写了以下内容:
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'
);
这显然不够好,所以我真诚地希望有人能够帮助解决如何提高效率。我不太习惯处理条目数以亿计的表格。
提前谢谢你!
【问题讨论】:
-
您在
joins 和where中使用的列是否有索引? -
用户数据是每次都存在于所有四个表中还是取决于。根据您的搜索要求,您正在以不正确的方式在文本前后使用 % 符号。
-
对于优化查询计划会很有帮助。一个问题是,您要加入的 ID 上是否有任何索引
-
在
WHERE子句中包含u.userAge > 40会使user上的LEFT OUTER JOIN成为INNER JOIN。也就是说,我猜你的数据结构是这样的,你可能想在任何地方使用INNER JOINS。
标签: mysql sql optimization query-optimization