面试题答案
一键面试切分思路
- 按时间切分:由于是查询过去一周内的数据,可根据
transaction_time
字段进行切分。假设每个分片都有完整的时间范围数据,先按时间过滤出过去一周的数据。这可以利用MySQL的日期函数来实现,减少每个分片上需要处理的数据量。 - 按用户ID切分:分布式环境下,不同分片可能存储不同用户的交易记录。为了找到交易金额总和前10的用户,可将用户ID范围进行合理划分,分别在每个分片上计算各自范围内用户的交易金额总和,这样能并行处理数据,提高查询效率。
实现步骤
- 确定过去一周的时间范围:使用MySQL的日期函数
CURRENT_DATE
获取当前日期,再通过INTERVAL
关键字计算出过去一周的起始日期。例如:
SET @start_date = CURRENT_DATE - INTERVAL 7 DAY;
- 在每个分片上进行本地计算:
- 对每个分片执行如下查询,计算每个用户在过去一周内的交易金额总和:
SELECT user_id, SUM(amount) AS total_amount
FROM transactions
WHERE transaction_time >= @start_date
GROUP BY user_id;
- 合并各分片结果:将每个分片上计算得到的用户交易金额总和结果收集起来,在一个汇总节点(或内存中)进行合并。
- 找出前10的用户:对合并后的结果按照
total_amount
进行降序排序,并取前10条记录。
最终查询逻辑
假设各分片的结果存储在临时表tmp_results
中(字段为user_id
和total_amount
),在汇总节点上的最终查询逻辑如下:
SELECT user_id, total_amount
FROM (
SELECT user_id, total_amount
FROM tmp_results
ORDER BY total_amount DESC
LIMIT 10
) AS top_users;
如果是在程序中实现,可通过编程语言连接各个分片数据库执行本地计算,然后将结果收集到程序内存中,利用程序的排序功能找出前10的用户。例如在Python中使用pymysql
库连接数据库,将每个分片的结果读取到列表中,然后使用heapq
模块找出前10的用户。