Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何加快从两个表搜索sql查询的速度?_Mysql_Sql - Fatal编程技术网

Mysql 如何加快从两个表搜索sql查询的速度?

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,

下面是一个例子,我有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, '%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'

这些表上有索引吗?第二个查询与第一个查询不同。第二个查询执行交叉连接,其中第一个查询执行内部连接。这种类型的隐式联接语法也已被弃用。您应该使用显式联接。它们更清晰、更清晰,并且在需要时更容易转换为外部联接。这些表上有索引吗?第二个查询与第一个查询不同。第二个查询执行交叉连接,其中第一个查询执行内部连接。这种类型的隐式联接语法也已被弃用。您应该使用显式联接。它们更干净、更清晰,并且在需要时更容易转换为外部联接。