为什么我的PHP和MySQL网站突然变得很慢?

时间:2014-08-19 10:16:11

标签: php mysql

我们在内部在FreeBSD服务器上运行AMP服务器。

MySQL 5.0.48
Apache 2.2
PHP 5.3.3

它应该被替换"现在任何一天",但我需要保持它并且一直运行到那时。它的唯一功能是托管内部网站。一切正常,直到上周,当网站上的部分页面(并非全部)突然开始加载速度非常慢时。从大约一秒钟到20秒钟。

问题的根源似乎是PHP和MySQL之间的交互。

数据库不是很大;最大的表包含近30万行,带有一些整数/日期/短文本。它最多有30个用户,通常少得多。

如果我在MySQL工作台中运行所有查询,则运行时间最长的查询将在0.3秒内执行。如果我添加所有持续时间,包括多次运行查询,则总时间远离20秒。

我使用内部IP作为绑定地址,并在从PHP连接时使用相同的地址。

我将网站和数据库复制到我的工作站,奇怪的是,它在我的工作站上和在服务器上一样慢,尽管机器在CPU和内存方面都要强大得多。

我真的坚持这个!

1 个答案:

答案 0 :(得分:1)

我们没有任何代码,我们没有任何关于此的sql相关信息。 所以我们可能无法给你一个负责任的回复。 只是猜测,我讨厌做的事情。 :)

对我来说,“突然”似乎并非一下子。 首先,你必须使用phpmyadmin让你的生活更轻松,并检查你的数组。

一切似乎都好吗? 只有30个用户吗? 有什么可疑的吗? 是否存在一个没有任何理由超载记录的数组?

另外,在编程或数据库设计方面,当性能无差异和设计不良之间存在阈值时,例如阵列变得更大。你没给我们足够的信息,但检查一下php中的任何算法是否在RAM上加载一个完整的数组来做些什么。这将是编程设计不佳。

例如,创建一个FOR循环,嵌套在另一个FOR循环中以访问整个mysql表并将内容存储在数组中,消耗RAM, 然后进入这个嵌套的FOR,如果你有另一个FOR,那么使用每个数据访问另一个表,这样你可以根据以前的数据从另一个表中获取其他数据,以获得外键,这会让你陷入困境如果阵列变大了

我在伪代码中提到的不好的做法:

For i = 1 to m
   For j = 1 to n
      ! You get the data from the one table and store then in RAM into an array.
      ! We get the foreign key values and other stuff here.
      ! For each data you get...
      For k = 1 to w
         For L = 1 to x
            !...you get data from another table using the previously retreived foreign key
             !and store them in an array consuming even more RAM.
            ! Do something
            ! Show results.
         end_for
       end_for
    end_for
end_for

作为一种良好的实践解决方案,如果是这样, 我建议只使用MySQL进行查询控制。 还可以查看JOIN命令。 对于JOIN命令,请阅读HERE

如果不是这样的话......我真的不知道。

编辑:让糟糕的做法示例更有意义。