【问题标题】:Laravel migrations/db:seed super slowLaravel 迁移/db:seed 超级慢
【发布时间】:2015-10-20 18:29:12
【问题描述】:

我最近从旧的 Windows 计算机升级到了 gen。 4 I7 Ubuntu 15.04

运行起来就像做梦一样,嗯...除了任何涉及数据库的 Laravel 工匠命令需要一百万年才能完成,而我的旧计算机在几秒钟内执行任何这些命令。

主要区别在于,我将 MySQL 作为本地服务运行,而不是 XAMPP。

此外,在我的旧计算机上,我可以看到迁移如何缓慢地显示在屏幕上,因为它们似乎正在被处理,而现在,大约需要 2 到 5 分钟,完成后,整个迁移列表会立即显示。 这可能表明某处存在某种瓶颈。

在互联网的某个地方,有人说使用 '127.0.0.1' 而不是 'localhost',因为DSN 分辨率。没解决。

为了确保这不是我遇到的问题

    $time = microtime(true);

    //also with host=127.0.0.1
    new PDO("mysql:host=localhost;dbname=some_db", "username", "password");

    //some simple queries here...

    //yielded similar marginal times
    echo microtime(true) - $time;

~半拍


编辑

我从框架中收集了每个查询的运行时间,我有 LOTS 的迁移,分析数据我发现没有什么异常慢(比如运行一分钟的查询)。

Here's a link with the data。实际询问被省略了,有利于我的雇主。

虽然有许多查询运行一秒或更长时间,但最慢的 number 221 需要 3.5 秒。

我有大约一百次迁移(我知道),但问题是,如果每次迁移需要一秒钟,我会等待大约一分半钟才能迁移,但通常需要 4 到 5 分钟。

根据 Oliverpool 的建议,我通过终端在 mysql 上重放查询进行了一些分析,但我从来不需要等待超过一秒,平均查询需要大约一秒。

这是最慢查询的分析图片(迁移时间为 3.5 秒,图片中不到一秒)

也许这指向连接?顺便说一下,运行迁移后慢查询日志为空

另外,我现在使用的是 laravel 5,行为是一样的。我不知道如何解决连接问题,所以我想一些谷歌搜索是为了,欢迎任何建议。

提前致谢

【问题讨论】:

  • 你能不能在 mysql 客户端运行一些查询来确保不是 MySQL 速度慢。另外,运行 php -v 以确保不是 PHP 速度慢。
  • 你确定你的 Laravel 数据库配置是正确的吗?也许你可以做一些分析,看看哪些查询是由工匠执行的,然后重放它们。
  • 请检查您的旧 Windows mysql.ini 以及新的 ubuntu mysql.ini。他们应该有不同的配置。检查缓冲区大小.. 这些文章可能会有所帮助 dba.stackexchange.com/questions/27328/… dev.mysql.com/doc/refman/5.5/en/server-parameters.html
  • 实际上可能与php-cli 相关,因为您说mysql 分析返回了最佳时间结果。我建议您比较从控制台和浏览器执行 php 脚本的时间。 php -q test.php pastebin.com/AwNJk33n 在我的例子中,cli 结果大约是 0.076 和 web 结果大约是 0.009
  • 运行迁移 24 小时然后运行 ​​mysqltuner 并修复你的 my.cnf 默认 ubuntu 配置是垃圾。我遇到了完全相同的问题,在 Windows 上的 wamp 上运行良好,交换到 linux 并且对于某些工作来说速度很慢。在我的情况下,它是内核上的文件句柄标志,并且没有为 innodb 分配足够的缓冲区,因此它全部在磁盘 IO 中而不是在 ram 中完成。

标签: php mysql laravel database-connection


【解决方案1】:

在这种情况下,我认为缓冲池大小增量是必需的。设置如下:

[mysqld]
innodb_io_capacity = 2000
innodb_read_io_threads = 64
innodb_thread_concurrency = 0
innodb_write_io_threads = 64

【讨论】:

    【解决方案2】:

    如果您使用的是 MySQL 8

    在我的情况下,问题是 MySQL 8 较慢 insert 速度发生 将 MySQL 5.7 更新到 8 后

    5.7 和 8.0 之间的区别在于 MySQL 8.0 中默认情况下二进制日志记录(用于复制和 PITR)是打开的。在 8.0 中不使用二进制日志记录运行

    此问题的快速解决方法是使用--disable-log-bin 启动您的 MySQL 服务器

    或者您可以在 my.cnf 中编写以下代码

    [mysqld]
    skip-log-bin
    

    欲了解更多信息,请访问

    https://dba.stackexchange.com/questions/216352/inserts-in-mysql-8-are-slower-than-inserts-in-mysql-5-7?newreg=fe2b7682e8314f07a785ddc9a8ffbdce

    https://dba.stackexchange.com/questions/227742/extreme-performance-loss-due-to-moving-from-mysql-5-7-23-to-mysql-8-0-status-c

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    • 请进一步解释这与问题的关系。 MySQL 8 在这个问题发布近三年后首次发布
    • @NicoHaase 我再次更新了我的答案,我希望现在可以了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2019-12-27
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    相关资源
    最近更新 更多