mariadb 历史大数据查询缓慢

x7rlezfr  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(137)

我遇到查询速度慢问题。

附言
玛丽亚数据库:mariadb:2015年3月10日-InnoDB

我优化了大多数数据库配置

结构

第一个

客户~ 1 - 5百万行
客户每日统计数据~ 1 - 1亿行
查询

select 
    customers.*,
    IFNULL(
            SUM(events_aggregation.event_1),
            0
        ) as event_1,
    IFNULL(
            SUM(events_aggregation.event_2),
            0
        ) as event_2,
    IFNULL(
            SUM(events_aggregation.event_3),
            0
        ) as event_3,
    IFNULL(
            SUM(events_aggregation.event_4),
            0
        ) as event_4
from
    `customers`
        left join customer_daily_stats as events_aggregation on `customers`.`id` = `events_aggregation`.`customer_id`
        and `events_aggregation`.`date` between '2021-09-06' and '2022-07-06'
group by
    `customers`.`id`;

问题

主要想法是有可能得到任何日期的聚合。
问题是现在的工作太慢了,我需要做加法聚合,这降低了性能。还有一个问题,我没有很多的磁盘空间(250 G和大约80%已经使用)。
我有:

*客户~ 1.5m
*客户每日统计数据~ 50.000
*查询速度~ 5s
问题

  • 有没有什么方法可以优化我的数据库或其他工具?
  • 是否有任何数据库可以帮助我提高性能?
w1e3prcc

w1e3prcc1#

更改索引。您当前有

unique (date, customer_id, campaign_id)
INDEX(customer_id, date)
INDEX(campaign_id)

可能更改为:

PRIMARY KEY(customer_id, date, campaign_id)
INDEX(campaign_id)

但是......这是一个很大的但是。这种索引的重新排列 * 可能 * 会严重损害其他查询。我们真的需要看看

  • 所有的大疑问
  • 每个EXPLAIN SELECT

您是否注意到范围是10个月 * 加1天 *?这是因为BETWEEN是“包含”的。
如果80%的磁盘已经被使用,你就陷入了深深的杂草中。任何修复都需要超过20%的磁盘才能实现。
有一件事要做(当你有足够的磁盘空间时),那就是在可行的情况下将BIGINT(8字节,可能是一个过大的范围)和INT UNSIGNED(4字节,最多40亿)压缩成更小的int类型。
我糊涂了,这些似乎互相矛盾;请澄清:
客户每日统计数据~ 1 - 1亿行
客户每日统计数据~ 50.000
还有一些有助于分析的东西:

innodb_buffer_pool_size
RAM size
disk footprint for tables (GB)

相关问题