MySQL分区还是删除旧数据?

问题描述 投票:3回答:2

我在mySQL的MyISAM上有一个最近的活动表,其中包含约4,600万条记录。它已正确索引,并且已完成所有操作。但是某些查询仍然需要花费几秒钟来执行。

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

我一直在考虑删除所有比今年早的数据,这将删除大约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 (?, ?, ?, ?, ?, ?, ?, ?, ?) ```
mysql laravel myisam
2个回答
0
投票
  • 删除大量表时,复制要保留的行更快。
  • 您应该从MyISAM移至InnoDB。
  • PARTITIONing将有助于将来清除旧数据。
  • 添加PARTITIONing将花费时间。任何删除旧数据的技术也将如此。哪个更重要?减少堵塞?或完成任务的速度。
  • PARTITIONing本身不会加快查询速度。但是,您似乎需要“ 2-D”索引。
  • 进入分区时必须重新考虑索引。
  • 摘要表可能会显着提高性能。

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

参考:


0
投票

您可以将一些数据移动到存档数据库,我的意思是将旧数据存储在单独的数据库(归档)中,而实际数据存储在当前数据库中。在这种情况下,您仍然可以对实际(新)数据保持良好的性能,并且可以同时访问旧数据。

要处理此问题,您需要在Laravel系统中设置2个连接-在config/database.php中创建新连接。

现在您应该能够像这样访问归档数据:

$archive_data = DB::connection('name_of_archive_connection')->table('table_name')->select('*')...
$actual_data = DB::connection('name_of_main_connection')->table('table_name')->select('*')...

此外,您也可以像上面的示例一样,通过插入/删除mysql函数轻松地在数据库之间移动数据。

© www.soinside.com 2019 - 2024. All rights reserved.