grigor007
@grigor007
http://goldapp.ru

MySQL запрос или вина хостера. Кто прав?

Добрый вечер!



У меня есть ресурс на облачном хостинге. Там есть скрипт поиска. Идет поиск по нескольким таблицам, но FULLTEXT индекс только у одного поля ( articles.article_text_for_search ). Объемы текстов по которым ведется поиск — большие. Количество записей в articles — 3 000



Дело в том, что когда работает скрипт search.php ( а это около 8-ми секунд ) — то остальные страницы с сайта, если их попробовать загрузить — сразу не отдаются. Отдаются только когда скрипт search.php начинает отдавать контент в браузер…



Хостер говорит, что это я виноват. И больше ничего не говорит. Я не гуру mysql, но как SELECT запросы могут мешать отдачи контента? ( LOCK Tables не использую, тип таблиц везде — MyISAM )



SELECT articles.id<br>
, articles.magazine_id<br>
, articles.issue_id<br>
, articles.article_name<br>
, articles.annotation<br>
, articles.article_text<br>
, SUBSTRING( articles.article_text, 1, 1000) as article_text_1<br>
, articles.section_id<br>
, articles.article_rating<br>
, articles.to_main<br>
, articles.article_unix_add<br>
, magazines.mag_name<br>
, magazines_issues.issue_number<br>
, GROUP_CONCAT( users.user_name ) AS user_names<br>
, GROUP_CONCAT( users.user_surname ) AS user_surnames<br>
, GROUP_CONCAT( tags.tag_name ) AS tag_names<br>
, sections.sec_name<br>
, CONVERT( GROUP_CONCAT( articles_authors.author_id ) USING utf8 ) AS author_ids<br>
, CONVERT( GROUP_CONCAT( articles_tags.tag_id ) USING utf8 ) AS tag_ids<br>
FROM magazines, users, sections, articles_authors<br>
JOIN articles<br>
LEFT JOIN magazines_issues<br>
ON articles.issue_id = magazines_issues.id<br>
LEFT JOIN articles_tags ON articles.id = articles_tags.article_id<br>
AND articles_tags.status = 'active'<br>
LEFT JOIN tags ON tags.id = articles_tags.tag_id<br>
WHERE <br>
(<br>
articles.article_name LIKE '%интересная статья%'<br>
OR MATCH (articles.article_text_for_search) AGAINST ('"интересная статья"' IN BOOLEAN MODE)<br>
OR users.user_name LIKE '%интересная статья%'<br>
OR users.user_surname LIKE '%интересная статья%'<br>
OR magazines.mag_name LIKE '%интересная статья%'<br>
)<br>
AND articles.magazine_id = magazines.id<br>
AND users.id = articles_authors.author_id<br>
AND articles.section_id = sections.id<br>
AND articles.article_status = 'published'<br>
AND articles_authors.article_id = articles.id<br>
AND articles_authors.status = 'active'<br>
GROUP BY articles.id<br>
LIMIT 0, 30<br>
  • Вопрос задан
  • 3748 просмотров
Решения вопроса 1
@edogs
Дело в том, что когда работает скрипт search.php ( а это около 8-ми секунд ) — то остальные страницы с сайта, если их попробовать загрузить — сразу не отдаются. Отдаются только когда скрипт search.php начинает отдавать контент в браузер…
— +
— Вопрос: если пока работает скрипт search.php попробовать открыть другую страницу в ДРУГОМ браузере — они будут отдаваться?
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
EugeneOZ
@EugeneOZ
Значит БД выедает весь CPU или дисковые IO, вот и вся хитрость.
Ответ написан
@cat_crash
Не отвечу на ваш вопрос и не буду критиковать решение, но имхо проще и правильней реализовать с помощью Sphinx Search
Ответ написан
Комментировать
script88
@script88
Если Вы явно не указываете блокировку, сервер сам ее выставит при select — read-lock при update — write-lock. В MyISAM блокируется вся таблица, в innoDB строка
Ответ написан
Комментировать
truekenny
@truekenny
Проблема может быть в сессии php, если у вас сессии хранятся на диске (/tmp/),
для решения переделать сессии на Базу Данных и такой задержки не будет.
Ответ написан
Комментировать
AxisPod
@AxisPod
Вспоминается анекдот: «Ну у вас и запросы, сказала база данных и повисла».

Более чем уверен, что индексы вообще не работают, а учитывая использования group о этом можно говорить даже не задумываясь. Посмотрите на запрос с помощью explain для начала и насладитесь тем ужасом, что приходится делать бд.

Тут куча временных таблиц создается, все это свапит постоянно на диск и т.д.

Либо запрос надо упрощать, либо переходить на другие решения, sphinx к примеру.
Ответ написан
mgyk
@mgyk
А может просто у хостера один воркер на клиента? он подвис в ожидании ответа от MySQL и все остальные в очереди
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы