【发布时间】:2013-09-26 20:11:25
【问题描述】:
我有一个带有 Apache、PHP 和 MySQL 的 EasyPHP 本地 Web 服务器。到目前为止,我一直在使用一个只有 500 条记录的数据库。有时在查询数据库时,在返回数据之前会有很大的延迟,可能大约 10 秒,但并不一致。也许每 10 个用户搜索就会发生一次。今天我将一堆测试数据加载到 6 个表中。现在每个表都有大约 15,000 条记录。现在,在搜索用户时,每次返回数据大约需要 25 秒。
这是 SELECT 查询:
SELECT SQL_CALC_FOUND_ROWS criteria.id, criteria.uid
FROM user_profile
INNER JOIN criteria ON (criteria.id = user_profile.cid)
WHERE ((criteria.city = 250)
AND (user_profile.dob BETWEEN STR_TO_DATE('1978-09-27', '%Y-%m-%d')
AND STR_TO_DATE('1993-09-27', '%Y-%m-%d'))
AND (criteria.gender = 2)
AND (EXISTS(SELECT id FROM criteria_interests
WHERE cid = user_profile.cid AND value = 1)
OR EXISTS(SELECT id FROM criteria_interests
WHERE cid = user_profile.cid AND value = 2)))
AND (user_profile.uid != 2)
LIMIT 0, 18
该查询大约需要 25 秒才能返回 202 个结果。如果我在 phpMyAdmin 中运行该查询,它会立即加载。
我不确定劫持在哪里。我知道SQL_CALC_FOUND_ROWS 有时会导致速度变慢,但不是 25 秒才能返回 202 行。这里有问题。
我想知道如何找出问题所在。我第一次提到的间歇性延迟基本上是在我安装EasyPHP之后发生的,所以我认为这是EasyPHP的问题。但现在看到随着更多数据库记录问题变得更糟,我认为这是一个 MySQL 问题。但是,当我在 phpMyAdmin 中运行查询时,速度非常快。所以现在我认为这是一个 PHP 问题。
我的 PHP 内存限制设置为 128M,这可能不是很多,但不会导致 25 秒的延迟。
有人知道我可以如何解决这个问题吗?在配置 Apache、PHP 或 MySQL 方面,我不是最懂行的,所以我不知道该怎么做。
感谢您的建议。
【问题讨论】:
-
你试过Kohana profiler。这至少可以确定您是否在正确的地方寻找。还要确保您在 MySql 中正确指定了索引,并考虑启用 Mysql slow query log。
-
我不知道探查器!这使我直接进入问题查询,这实际上是在搜索结果选择之后的 COUNT() 选择。谢谢你。这基本上回答了我的问题,所以如果你把它放在答案中,我会将其标记为已接受。