# 场景
有一个 orders 表,表中含有 order_id, status, financial_status,paid_at,customer_id 字段(还有一对的其他字段),表索引有所有字段各自的索引,还有组合索引 status, financial_status,paid_at (是有效订单的必然前置条件)。现在我的数据跨度有 3 年,数据行数有 400 万条。
# 目的
计算复购率。复购率逻辑:比如查询 2022.01.01-2023.03.01 范围时,在这个时间段内出现 customer_id 重复有 2 次及以上时算复购,复购率=复购用户数 /用户数唯一数。
# 问题
目前在现有的条件查询中,查询 1.5 年数据时计算结果长达 150s 。因为查询的时间范围太大了,导致了 MySQL 的选择器在处理时组合索引没有使用,变成了扫全表。
请问大佬们,有没有什么方法可以压缩这个请求结果的时长到 3s 以内的?
# 其他
无法使用缓存,如果使用缓存的话所需要缓存的数量为 C(N,2) = N*(N-1)/2)
有一个 orders 表,表中含有 order_id, status, financial_status,paid_at,customer_id 字段(还有一对的其他字段),表索引有所有字段各自的索引,还有组合索引 status, financial_status,paid_at (是有效订单的必然前置条件)。现在我的数据跨度有 3 年,数据行数有 400 万条。
# 目的
计算复购率。复购率逻辑:比如查询 2022.01.01-2023.03.01 范围时,在这个时间段内出现 customer_id 重复有 2 次及以上时算复购,复购率=复购用户数 /用户数唯一数。
# 问题
目前在现有的条件查询中,查询 1.5 年数据时计算结果长达 150s 。因为查询的时间范围太大了,导致了 MySQL 的选择器在处理时组合索引没有使用,变成了扫全表。
请问大佬们,有没有什么方法可以压缩这个请求结果的时长到 3s 以内的?
# 其他
无法使用缓存,如果使用缓存的话所需要缓存的数量为 C(N,2) = N*(N-1)/2)
