У меня есть локальный веб-сервер EasyPHP с Apache, PHP и MySQL. До сих пор я работал с базой данных, в которой всего 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 установлен на 128 МБ, что может быть немного, но это не вызовет 25-секундной задержки.
Кто-нибудь знает, как я могу решить эту проблему? Я не очень хорошо разбираюсь в настройке Apache, PHP или MySQL, поэтому не знаю, как это сделать.
Спасибо за любой совет.