我们在内部在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和内存方面都要强大得多。
我真的坚持这个!
答案 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
如果不是这样的话......我真的不知道。
编辑:让糟糕的做法示例更有意义。