Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL分区还是删除旧数据?_Mysql_Laravel_Myisam - Fatal编程技术网

MySQL分区还是删除旧数据?

MySQL分区还是删除旧数据?,mysql,laravel,myisam,Mysql,Laravel,Myisam,我在mySQL上有一个最新的活动表,它的MyISAM,包含大约4600万条记录。它已被正确索引,所有这些都已完成。但是一些查询仍然需要几秒钟才能对其执行 所以我想知道,在这个数据库上提高查询性能的最佳方法是什么。我应该分区表还是删除旧数据?我主要使用本月数据的一些计算来进行查询,另一个用途是显示用户最近的活动,以及我们必须不时手动监视他们的活动 我一直在考虑删除今年以前的所有数据,这将删除大约2400万行。(由于从本月初至今已有4个月了,所以旧的数据应该没有那么重要) 或者我可以根据月份进行分区

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

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

我一直在考虑删除今年以前的所有数据,这将删除大约2400万行。(由于从本月初至今已有4个月了,所以旧的数据应该没有那么重要)

或者我可以根据月份进行分区,但我不知道在laravel中如何实现,是否每次都要更改分区以获得比当前月份更早的数据

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

select  *
    from  `recent_activites`
    where  `id` > 20443580
      and  `user_id` = 20580
      and  `updated_at` > '2020-04-01 00:00:00'
      and  `type` in (?, ?, ?, ?, ?, ?, ?, ?, ?) ```
编辑: 查询: 此查询一次执行耗时8.72毫秒,但似乎总是超过1毫秒 时间之所以存在,是因为它减少了行数

这些是索引

  • 删除表中的大部分内容时,复制要保留的行会更快
  • 您应该从MyISAM迁移到InnoDB
  • 分区
    将有助于将来清除旧数据
  • 添加
    分区将花费时间。任何删除旧数据的技术也是如此。哪个更重要?减少堵塞?或者完成任务的速度
  • 分区本身不会加快查询速度。然而,您似乎需要一个“二维”索引
  • 在进行分区时,必须重新考虑索引
  • 摘要表可能会显著提高性能
上述几个步骤可以同时完成——切换到InnoDB、添加分区、删除旧数据、更改索引。(汇总表是一项单独的任务。)我建议在处理实时系统之前进行试验

参考资料:

  • 切换到InnoDB:
  • 分区——时间序列的优点、缺点、准则和代码:
  • 删除
    ——多种技术及其优缺点:
  • 汇总表:

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

要处理此问题,您需要在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函数轻松地在数据库之间移动数据,如上面的示例所示。

您也可以考虑将缓存与laravel一起使用,比如redis。是的,我也做了很多缓存,但这些数据必须经常更新。虽然缓存工作得很好,它将cpu使用率从50%降低到了20%,但我仍然每3小时为用户更新一次。但是对于第一次数据刷新,它仍然很慢。您在这里公开的两种方法都可以工作,您也可以进行复制,但是您应该考虑,如果没有,删除数据是否是一个好主意,您有您的答案。您还可以重新考虑您的数据库设计,显示诸如连接之类的内容。这取决于您在这里试图实现的目标,但您甚至可以使用多个数据库。也许你应该更具体一点,我对分区没有直接的经验,但我的一位MySQL专家同事说分区是邪恶的。我会转而选择复制或缓存解决方案。在您进行常规设置更改(离开MyISAM除外)或删除您可能仍然需要的数据之前,我会质疑您的前提“它已被正确索引,所有这些都已完成。”。例如,从您的描述和查询性能来看,您似乎只有单列索引,而您给定的查询需要一个复合索引,
(user\u id,updated\u at)
可能就足够了。如果您需要这方面的帮助,您应该始终给出查询、表结构(
show create table…
)和执行计划(在查询前面写
explain
)以及时间。我切换到InnoDB,但现在我得到了更慢的此表查询。有没有关于如何提高速度的想法?也减少了一半的行数,现在是8800万行,现在是4000万行。最后,还添加了2D和3D索引。尚未对数据库进行分区。我不认为汇总表会有那么大的帮助?因为我正在尝试获取特定用户id的最后10行mainly@SahaabZahid-“特定用户id的最后10行”应该相当快。如果没有,让我们看看查询。这花了8.72毫秒从
最近的活动
中选择*其中
用户id
=326和
更新时间
'2020-08-26 16:59:25'按
id
desc limit 10我设置了更新时间,因为由于索引,它减少了查看的所有行,它动态变化到1个月前,我将向主菜单添加解释、查询和索引的图像post@SahaabZahid-(回复您的上述评论)有足够多的差异,您应该开始一个新的问题。请包括
SHOW CREATE TABLE