【发布时间】:2017-03-07 16:07:23
【问题描述】:
这是一个例子,所以我有表user和表city,它们是这样的:
user 列是(user_id、city_id、timestamp)[user_id 和 city_id 是唯一的]
city 列是 (city_name, city_id) [city_id 是唯一的]
我想从某个城市获取给定日期的用户数,所以基本上我是这样做的:
select city_id, city_name,
(select count(user.user_id)
from user, city
where DATE_FORMAT(user.timestamp, '%Y-%m-%d') = '2017-03-07'
and user.city_id = ct.city_id) as user_count
from city ct
where (city_id = 20 or city_id = 30)
结果:
city_id, city_name, user_count
20 New York 100
30 LA 200
然后我意识到这比直接搜索要慢得多
select count(user.user_id)
from user, city
where DATE_FORMAT(user.timestamp, '%Y-%m-%d') = '2017-03-07'
and user.city_id = 20
这是为什么?原始搜索中的ct.city_id 不是已经设置为20 还是30?我应该如何优化搜索并获得我想要的表格格式的结果?
【问题讨论】:
-
这些表有索引吗?
-
您的第二个查询与第一个查询不相同。第二个查询正在执行
CROSS JOIN,而第一个查询正在执行INNER JOIN。这种类型的隐式JOIN语法也已被over 25 years 弃用。您应该使用明确的JOINs。如果需要,它们更干净、更清晰,并且更容易转换为OUTER JOINs。