我遇到查询速度慢问题。
附言
玛丽亚数据库: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
问题
- 有没有什么方法可以优化我的数据库或其他工具?
- 是否有任何数据库可以帮助我提高性能?
1条答案
按热度按时间w1e3prcc1#
更改索引。您当前有
可能更改为:
但是......这是一个很大的但是。这种索引的重新排列 * 可能 * 会严重损害其他查询。我们真的需要看看
EXPLAIN SELECT
您是否注意到范围是10个月 * 加1天 *?这是因为
BETWEEN
是“包含”的。如果80%的磁盘已经被使用,你就陷入了深深的杂草中。任何修复都需要超过20%的磁盘才能实现。
有一件事要做(当你有足够的磁盘空间时),那就是在可行的情况下将
BIGINT
(8字节,可能是一个过大的范围)和INT UNSIGNED
(4字节,最多40亿)压缩成更小的int类型。我糊涂了,这些似乎互相矛盾;请澄清:
客户每日统计数据~ 1 - 1亿行
客户每日统计数据~ 50.000
还有一些有助于分析的东西: