Mysql 如何加快从两个表搜索sql查询的速度?
下面是一个例子,我有table user和table city,它们是这样的: 用户列包括用户id、城市id、时间戳[用户id和城市id是唯一的] 城市列为城市名称、城市id[城市id是唯一的] 我想从某个城市获取给定日期的用户数,所以基本上我是这样做的:Mysql 如何加快从两个表搜索sql查询的速度?,mysql,sql,Mysql,Sql,下面是一个例子,我有table user和table city,它们是这样的: 用户列包括用户id、城市id、时间戳[用户id和城市id是唯一的] 城市列为城市名称、城市id[城市id是唯一的] 我想从某个城市获取给定日期的用户数,所以基本上我是这样做的: select city_id, city_name, (select count(user.user_id) from user, city where DATE_FORMAT(user.timestamp,
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\u id是否已设置为20或30?我应该如何优化搜索并以我想要的表格格式获得结果?您可以改进查询,避免子选择并使用内部联接和分组方式
select city_id, city_name, count(user.user_id)
from user
inner join city on user.city_id = city.city_id
where DATE_FORMAT(user.timestamp, '%Y-%m-%d') = '2017-03-07'
and city_id in (city_id = 20 or city_id = 30)
group by city_id, city_name
您可以通过避免子选择和使用内部联接和分组方式来改进查询
select city_id, city_name, count(user.user_id)
from user
inner join city on user.city_id = city.city_id
where DATE_FORMAT(user.timestamp, '%Y-%m-%d') = '2017-03-07'
and city_id in (city_id = 20 or city_id = 30)
group by city_id, city_name
我假设MySQL在第一个查询中选择将派生表具体化为一个内部临时表,而在第二个查询中没有这样做 对于FROM子句中的派生表子查询,优化器有以下选择: 将派生表合并到外部查询块中 将派生表具体化为内部临时表
来源:我假设MySQL在第一次查询中选择将派生表具体化为一个内部临时表,而在第二次查询中没有这样做 对于FROM子句中的派生表子查询,优化器有以下选择: 将派生表合并到外部查询块中 将派生表具体化为内部临时表 来源:试试这个:
select city_id, city_name, count(user.user_id) as user_count
from city ct
inner join user on user.city_id = ct.city_id
where (ct.city_id = 20 or ct.city_id = 30)
AND DATE_FORMAT(user.timestamp, '%Y-%m-%d') = '2017-03-07'
试试这个:
select city_id, city_name, count(user.user_id) as user_count
from city ct
inner join user on user.city_id = ct.city_id
where (ct.city_id = 20 or ct.city_id = 30)
AND DATE_FORMAT(user.timestamp, '%Y-%m-%d') = '2017-03-07'
这些表上有索引吗?第二个查询与第一个查询不同。第二个查询执行交叉连接,其中第一个查询执行内部连接。这种类型的隐式联接语法也已被弃用。您应该使用显式联接。它们更清晰、更清晰,并且在需要时更容易转换为外部联接。这些表上有索引吗?第二个查询与第一个查询不同。第二个查询执行交叉连接,其中第一个查询执行内部连接。这种类型的隐式联接语法也已被弃用。您应该使用显式联接。它们更干净、更清晰,并且在需要时更容易转换为外部联接。