Laravel每个Migration执行耗时过长问题求助
Laravel迁移执行异常缓慢问题
正常情况下单个Laravel Migration执行耗时约20~50ms(取决于系统资源与配置),但执行php artisan migrate或php artisan migrate:fresh命令时,每个迁移文件的执行耗时高达2000~10000ms。
运行环境信息
- OS: Ubuntu 22.04.2 LTS x86_64
- Kernel: 5.19.0-46-generic
- Shell: zsh 5.8.1
- CPU: Intel i7-4800MQ (8) @ 3.700GHz
- Memory: 31997MiB
- MySQL: 8.0.33
- PHP: 7.4
已尝试的MySQL配置调整(无效果)
max_binlog_size = 100M innodb_io_capacity = 2000 innodb_read_io_threads = 64 innodb_thread_concurrency = 0 innodb_write_io_threads = 64 default_authentication_plugin=mysql_native_password
迁移耗时监控截图

排查建议
- 检查数据库连接地址:将
.env里的DB_HOST从localhost改为127.0.0.1,部分系统中localhost会优先使用Unix Socket,可能存在性能瓶颈,切换为TCP连接测试 - 临时关闭MySQL日志:关闭
general_log和slow_query_log,日志写入会占用额外IO资源,测试是否能降低耗时 - 单独测试迁移SQL:把迁移文件中的SQL语句提取出来,直接在MySQL客户端执行,判断是Laravel层面还是数据库层面的问题
- 监控系统磁盘IO:使用
iostat -x 1命令查看磁盘读写负载,如果%util接近100%,说明磁盘IO是瓶颈,考虑更换更快的存储或优化磁盘配置 - 检查数据库连接复用:查看Laravel的数据库连接池配置,确保迁移过程中连接被复用,避免频繁创建销毁连接
- 禁用迁移事务(谨慎操作):部分复杂迁移在事务中执行会导致锁等待,可在迁移文件的
up方法开头添加Schema::disableForeignKeyConstraints(),执行完成后再启用,注意这会关闭外键约束校验,需确保数据完整性
内容的提问来源于stack exchange,提问作者H.Rad
相关产品推荐
相关产品推荐

