gpt4 book ai didi

mysql - 更快的 Laravel 迁移,用于测试具有大量表的项目

转载 作者:行者123 更新时间:2023-12-04 15:18:31 24 4
gpt4 key购买 nike

我刚刚开始从事这个零测试的大项目。我们的想法是对每个新功能和/或错误进行 TDD,随着时间的推移,我们将增加测试覆盖率。

我不使用 SQLite 内存数据库进行测试。我确实更喜欢使用 MySql,因为它与我在生产中使用的数据库相同。通常,在小项目中,这没有问题,但在大项目中,它是!

我遇到的问题与性能有关,一个在磁盘中运行的普通 MySql 实例 (M.2 SSD) 需要大约 90 秒 来运行这个大项目的所有迁移。有 200 多个表要迁移,其中有很多关系。

这个问题的解决方案是在内存中也设置 MySql,使用 tmpfs 和 docker。这个技巧让我可以将迁移时间减少到只有 10 秒,不错,但如果你只想运行 1 个测试,那真的很烦人! 10 秒迁移,几毫秒测试。

Laravel 8 刚刚带来了一个名为Schema Dump 的新功能:https://github.com/laravel/framework/pull/32275

我刚刚看到这个新功能,它真的把我逗乐了,非常好!它将帮助很多人并节省大量时间。如果您有很多迁移,则可以显着减少全部迁移的时间。否则,这不能解决我的问题。该项目的迁移次数非常接近每个表 1 次迁移。无需在此处优化任何内容。

出于好奇,我拍摄了数据库的 Schema 快照并尝试使用 MySql 命令行恢复它。运行架构还原并设置所有内容大约需要 3 秒:

 mysql -h 127.0.0.1 -u root -P 3331 -p default < database/migrations.sql

目前,测试数据库一直保持迁移状态,这样我的测试流程(一次测试一次运行)保持超快!

我喜欢认为单个测试应该像一个按钮,您按下它,它会立即亮起绿色或红色。

我的问题:- 对于具有大量表的项目,是否可以减少更多的迁移时间?(仅用于测试)

我对 MySql 不了解,也许我遗漏了什么...

最佳答案

如果目标是在某个时间点加载数据库,并且您需要重复使用同一个快照,那么我建议尝试 LVM 快照,而不是“迁移”。

它涉及磁盘 的操作系统级快照。你会安排在磁盘上只有 MySQL 数据集,并像这样使用 LVM:

一次性设置:停止 mysqld,获取 LVM 快照

当准备重新加载该快照时,执行不同的 LVM 魔术以使用快照而不是磁盘的当前状态。

抱歉,我无法预测需要多少秒,但它根本不涉及 mysqldump。

关于mysql - 更快的 Laravel 迁移,用于测试具有大量表的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63855888/

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