Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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 - Fatal编程技术网

MySQL查询在实时数据库上速度慢,在本地速度快?

MySQL查询在实时数据库上速度慢,在本地速度快?,mysql,Mysql,我正在优化MySQL查询,但遇到了一个奇怪的问题。我从不使用实时生产数据库,因此我创建了一个转储,并使用mysqldump将其导入本地机器上的数据库,无需其他选项 生产数据库和我的本地虚拟机上的mysql版本几乎完全相同: 制作: mysql版本14.14发行版5.1.61,适用于使用readline 6.2的debian linux gnu(x86_64) 虚拟机: mysql版本14.14发行版5.1.63,适用于使用readline 6.2的debian linux gnu(x86_64)

我正在优化MySQL查询,但遇到了一个奇怪的问题。我从不使用实时生产数据库,因此我创建了一个转储,并使用
mysqldump
将其导入本地机器上的数据库,无需其他选项

生产数据库和我的本地虚拟机上的mysql版本几乎完全相同:

制作: mysql版本14.14发行版5.1.61,适用于使用readline 6.2的debian linux gnu(x86_64)

虚拟机: mysql版本14.14发行版5.1.63,适用于使用readline 6.2的debian linux gnu(x86_64)

这个查询相当复杂,在生产环境中大约需要4-5秒,但在虚拟机上不到1秒。我能想到的唯一一件事是,生产数据库上可能存在阻止查询立即运行的锁,而查询必须等待这些锁

对每个数据库运行查询时的
EXTENDED EXPLAIN
几乎相同,只是有一些细微的差异

我在查询之前使用了
SQL\u NO\u CACHE
,以确保查询没有命中缓存

因此,我的问题是:

  • 当我使用生产数据库的副本时,是什么导致
    EXTENDED EXPLAIN
    的差异,甚至是很小的差异,而mysql版本是相同的
  • 有什么原因我没有想到会导致相同的查询在生产数据库上花费更长的时间吗

  • 有许多因素可能会影响此执行时间:

    生产系统上的装载情况如何?您有多少IO净空?如果您的系统忙于运行其他查询或执行大量IO,则任何查询的性能都会受到严重影响

    通常,您可以使用
    SHOW PROCESSLIST
    来帮助识别当前正在运行的内容,并使用类似
    iotop
    的程序来查看正在进行的IO量

    您的虚拟机是否正在使用SSD?即使是一台带有SSD的中端开发机器,对于任何严重依赖随机访问的数据库服务器,也会让几乎所有基于HD的数据库服务器望而却步

    您是否在生产系统上尝试过
    优化表格
    ?执行还原时,表始终会自动优化。在实时系统上,当您
    插入
    删除
    行时,表将缓慢降级

    确保两者使用相同的存储引擎。MyISAM通常比InnoDB快,但在生产环境中使用关键数据并不安全。检查
    SHOW TABLE STATUS
    ,查看每个表使用的引擎。您可能有不同的默认值


    还要检查
    /etc/my.cnf
    是否已相应调整。MySQL的默认配置非常糟糕。你真的需要为InnoDB缓冲区分配更多内存,否则性能会很糟糕。

    与其让我们推测扩展解释可能存在差异的所有可能原因,不如告诉我们它们之间的差异,我们可以尝试找出它们。每个数据库中的数据相似吗?也就是说,live数据库中的数据是否显著增加?每个数据库中的数据都是相同的。谢谢!我发现导入数据库副本会导致快速查询,这一点非常奇怪。所以我这样做了,并开始使用副本作为生产数据库。我可以假设,由于我导入一个新的数据库已经进行了优化,在原始数据库上运行optimizetable也会解决这个问题。我试试这个。