У меня есть локальный веб-сервер EasyPHP с Apache, PHP и MySQL. До сих пор я работал с базой данных, в которой всего 500 записей. Иногда при запросе базы данных была бы большая задержка, может быть, около 10 секунд, прежде чем данные будут возвращены, но это было непротиворечиво. Возможно, каждый 10-й поиск пользователя произойдет. Сегодня я загрузил кучу тестовых данных в 6 таблиц. Каждая таблица теперь имеет около 15 000 записей. Теперь, просматривая пользователей, требуется, чтобы данные возвращались и выполнялись каждый раз около 25 секунд.SQL-запрос чрезвычайно медленный в веб-приложении Kohana на сервере win7 на EasyPHP
Вот ВЫБРАТЬ запрос:
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] (http://kohanaframework.org/3.3/guide/kohana/profiling). Это, по крайней мере, определит, если вы смотрите в нужное место. Также убедитесь, что вы правильно указали свои индексы в MySql и изучите возможность включения [Mysql slow query log] (http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html). –
Я не знал про профилировщик! Это привело меня прямо к проблемному запросу, который фактически был выбран COUNT() сразу после выбора результатов поиска. Спасибо вам за это. Это в основном отвечало на мой вопрос, поэтому, если вы положите это в ответ, я помечаю его как принятый. – Gavin