gpt4 book ai didi

MySQL 分区或删除旧数据?

转载 作者:行者123 更新时间:2023-12-04 04:13:44 25 4
gpt4 key购买 nike

我在 mySQL 上有一个最近的事件表,它的 MyISAM 包含大约 4600 万条记录。它已正确编入索引,所有这些都已完成。但是一些查询仍然需要几秒钟才能对其执行。

所以我想知道,提高该数据库查询性能的最佳方法是什么。我应该对表进行分区还是删除旧数据?我主要是对这个月的数据进行一些计算来查询,另一个用途是向用户展示他们最近的事件,以及我们不得不不时地手动监控他们的事件。

我一直在考虑删除所有比今年早的数据,应该删除大约 2400 万行。 (因为从本月初到现在已经 4 个月了,所以那么旧的数据应该没有那么重要)。

或者我可以根据月份进行分区,但我不知道这在 laravel 中如何实现,我是否必须每次更改分区才能获取比当前月份更早的数据?

编辑:这个 1 查询是一个重要的查询,它是在用户的特定事件之后执行的,这个特定查询执行了 8 秒,它使用 user_id 索引遍历了 40,000 行。如果它使用多个索引,那将有助于我改进这个查询,因为这样查询就会缩小到非常少的行。或者,如果我删除旧数据,那么完成计算所需的行数就会减少。

select  *
from `recent_activites`
where `id` > 20443580
and `user_id` = 20580
and `updated_at` > '2020-04-01 00:00:00'
and `type` in (?, ?, ?, ?, ?, ?, ?, ?, ?) ```

编辑:询问 :此查询执行 1 次需要 8.72 毫秒,但似乎总是需要超过 1 毫秒时间在那里,因为它减少了行数

enter image description here

这些是索引 enter image description here

最佳答案

  • 删除那么多表格时,复制要保留的行会更快。
  • 您应该从 MyISAM 迁移到 InnoDB。
  • PARTITIONing 有助于将来清除旧数据。
  • 添加PARTITIONing 会花费时间。删除旧数据的任何技术也是如此。哪个更重要?减少堵塞?或者完成任务的速度。
  • PARTITIONing 本身不会加快查询速度。但是,您似乎需要一个“二维”索引。
  • 在进行分区时,您必须重新考虑索引。
  • 汇总表可能会显着提高性能。

上述几个步骤可以同时完成——切换到 InnoDB、添加分区、删除旧数据、更改索引。 (汇总表是一项单独的任务。)我建议在处理您的实时系统之前进行试验。

引用资料:

关于MySQL 分区或删除旧数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61173589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com