首页 > 解决方案 > 从大型 SQL 表中获取摘要/过滤器的最佳实践

问题描述

在我们的系统中,用户可以是两种类型

  1. 客户
  2. 附属客户

客户可以有一个列表,附属客户可以有多个列表。因此,我们会收到针对列表的调用,并将它们存储在称为调用日志表的表中。

现在这张表有大约 500 万条记录,而且这张表每分钟都在增长。通话记录属于列表和用户(客户/附属公司)。因此,通话记录可以包含(客户 ID 和列表 ID)或(附属客户 ID 和列表 ID)。

我们在呼叫日志页面上显示过滤器一个管理门户来过滤呼叫日志。管理员可以按客户、附属客户和列表过滤通话记录。

这就是我从通话记录表中获取客户、附属公司和列表以进行过滤的方式。

select * from `call_logs` order by `call_logs`.`id` asc limit 500 offset 0

所以在得到 500 个通话记录后,我提取

  1. 具有客户端类型的用户并将它们存储在名为客户端过滤器数组的变量中。
  2. 具有关联客户类型的用户并存储在称为关联过滤器数组的变量中。
  3. 唯一列表并存储在列表过滤器数组中。

在遍历整个 call_logs 表之后,因为我将表分块到每个循环 500 行,所以我在管理门户页面上显示了这些过滤器。

问题/问题: 因为表很大,所以基于类型(客户和附属客户)和列表分离用户需要很长时间,所以管理员必须等待页面加载。我还尝试在通过 ajax 成功加载页面后加载这些过滤器,但大多数情况下它需要的时间太长。

我不能按用户类型(如 user_id、affiliate_client_id 或 listing_id)使用组。因为如果通过affiliate_client_id 分组,那么affiliate 可以有多个listing 不同的call,所以它会选择一个call,listing 是一样的东西。

标签: mysqlsql

解决方案


您需要一个关于 user_id 和 call_fee 列的索引,并且此查询在一个查询中计算所有用户的通话费:

SELECT `user_id`,sum(`call_fee`) 
FROM `call_logs` 
GROUP BY `user_id`;

推荐阅读