sql count-on-join查询需要花费很长时间才能执行?

but5z9lq  于 2021-06-19  发布在  Mysql
关注(0)|答案(3)|浏览(407)

我正在尝试对2表联接运行count查询。e\u客户端表有一百万个条目/行,而m\u用户只有50行,但count查询要花很长时间!

SELECT COUNT(`e`.`id`) AS `count` 
FROM `e_amazing_client` AS `e` 
LEFT JOIN `user` AS `u` ON `e`.`cx_hc_user_id` = `u`.`id` 
WHERE ((`e`.`date_created` >= '2018-11-11') AND (`e`.`date_created` >= '2018-11-18')) AND (`e`.`id` >= 1)

我不知道这个问题怎么了?

db2dz4w8

db2dz4w81#

您的查询正在提取2018-11-11当天/之后的所有记录,因为您的where子句的id>=1您在其中没有针对特定用户的子句。根据日期>=2018-11-18,您的原始查询中也有。你的意思可能是你只想要11/11到11/18周内的计数,而这个数字应该是>=11-11和<=11-18。
至于计数,您得到的是所有人(假设没有条目的id小于1)以及该日期范围内的计数。如果您希望按您所指示的每个用户进行分组,则需要按cx\u hc\u user\u id(user)列进行分组,以查看谁拥有最多的用户,或者将用户作为where子句的一部分来获取一个人。

SELECT 
      e.cx_hc_user_id,
      count(*) countPerUser
   from
      e_amazing_client e
   WHERE 
          e.date_created >= '2018-11-11'
      AND e.date_created <= '2018-11-18'
   group by
      e.cx_hc_user_id

您可以按计数降序获得计数最高的用户,但仍然不能肯定您的请求。

nkkqxpd9

nkkqxpd92#

首先,我想这已经足够了:

SELECT COUNT(*) AS `count` 
FROM e_amazing_client e
WHERE e.date_created >= '2018-11-11' AND e.id >= 1;

如果 user 只有50行,我怀疑这是创建重复。比较 date_created 是多余的。
对于此查询,请尝试在上创建索引 e_amazing_client(date_created, id) .

xxls0lw8

xxls0lw83#

也许你想要这个:

SELECT COUNT(`e`.`id`) AS `count` 
FROM `e_amazing_client` AS `e` 
LEFT JOIN `user` AS `u` ON `e`.`cx_hc_user_id` = `u`.`id` 
WHERE ((`e`.`date_created` >= '2018-11-11') AND (`e`.`date_created` <= '2018-11-18')) AND (`e`.`id` >= 1)

在两个日期之间检查?
还有,你真的需要吗

AND (`e`.`id` >= 1)

如果 id 一个id通常在一个表中,是否有一个案例 <1 ?

相关问题