loading...

Авторизация ...

Имя пользователя :
Пароль :
я всё забыл!

СоветыМедленные запросы

Написал walkman7, 13 января 2011 | 33 комментария | рейтинг новости не нравится   +15   нравится Версия для печати
Привет всем, вот сегодня столкнулся с проблемой при которой мускул может лечь и спать пока его не убют :)
А точнее, некоторые запросы ДЛЕ на довольно мощной машине выходили за пределы 1 секунды. Я стал исследовать mysql.slow-queries.log и наткнулся очень много запросов на выборку похожих новостей.
И вот что мне удалось узнать ...
Я посмотрел как работает это:
Строка show.full.php:
                if( strlen( $row['full_story'] ) < strlen( $row['short_story'] ) ) $body = $row['short_story'];
                else $body = $row['full_story'];
                
                $body = $db->safesql( strip_tags( stripslashes( $metatags['title'] . " " . $body ) ) );
                
                $config['related_number'] = intval( $config['related_number'] );
                if( $config['related_number'] < 1 ) $config['related_number'] = 5;
                
                $db->query( "SELECT id, title, date, category, alt_name, flag FROM " . PREFIX . "_post WHERE MATCH (title, short_story, full_story, xfields) AGAINST ('$body') AND id != " . $row['id'] . " AND approve='1'" . $where_date . " LIMIT " . $config['related_number'] );


Давайте разберемся с тем что мы будем задавать в AGAINST (), $body:
В $body мы получаем Заголовок новости + краткую или полную новость (зависит где меньше текста)
В результате этого не всегда срабатывает функция strlen() (по крайней мере у меня попадаются тексты полных новостей) и мы получаем $body примерно 10КБ (1000 слов).

И так у нас есть что искать, начнем...

В DLE используется полнотекстовый поиск по таким полям (title, short_story, full_story, xfields), если использовать его с текстом в 1000 слов, это сильно грузит мускул.
# Query_time: 2.399032 Lock_time: 0.460428 Rows_sent: 10 Rows_examined: 11 Rows_affected: 0 Rows_read: 11

~2.4 секунды для запроса, я считаю очень много.

по этому я сделал FULLTEXT поиск только для названия новости и краткой новости:
ALTER TABLE `dle_post` DROP INDEX `short_story` ,
ADD FULLTEXT `short_story` (
`short_story` ,
`title`
)


и поменял
WHERE MATCH (title, short_story, full_story, xfields)
на
WHERE MATCH (title, short_story)


Выводы:
Для тех же запросов на нагруженной машине я получал от 0,5 до 50 мс на запрос вместо ~2,4 сек.
С $body я ничего не делал, кому хостер бьет по бошке за нагрузку на БазуДанных рекомендую использовать это:
$body = $db->safesql( strip_tags( stripslashes( $metatags['title'] ) ) );

и удалить это
                if( strlen( $row['full_story'] ) < strlen( $row['short_story'] ) ) $body = $row['short_story'];
                else $body = $row['full_story'];

а также выполнить запрос
ALTER TABLE `dle_post` DROP INDEX `short_story` ,
ADD FULLTEXT `short_story` (
`title`
)


Отблагодарили: dimka888, Yeti, ropog72, webman, spanchbob, kabmir, DNBATTACK

Комментарии пользователей

  Экспорт комментариев в RSS
 Сортировать по рейтингу, по дате

Написал Vic3, 14 января 2011 в 14:23 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 3, Пользователи
Карма:
а что этот запрос дает?

ALTER TABLE `dle_post` DROP INDEX `short_story` ,
ADD FULLTEXT `short_story` (
`short_story` ,
`title`
)


И как сделать обратный процесс если я хочу вернуть всё как было раньше? В пхп файле всё понятно, обратно поменял и все, а с базой?

Написал walkman7, 14 января 2011 в 15:02 плохой комментарий   0   хороший комментарий
Новостей: 4, комментариев: 117, Пользователи
Карма: -5±
ALTER TABLE `dle_post` DROP INDEX `short_story` ,
ADD FULLTEXT `short_story` (
`short_story` ,
`full_story`,
`xfields` ,
`title`
)

Написал димон, 14 января 2011 в 18:51 плохой комментарий   0   хороший комментарий
Новостей: 2, комментариев: 59, Пользователи
Карма: -1±
walkman7, отлично, то, что надо.
А Вы не могли бы написать пошаговую инструкцию?

Написал Bomberman, 14 января 2011 в 19:14 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 171, Пользователи
Карма:
димон вы напишите где именно непонятно

Написал MSW, 14 января 2011 в 21:28 плохой комментарий   0   хороший комментарий
Новостей: 26, комментариев: 112, Пользователи
Карма:
а ещё надо теже правки сделать в файле /engine/ajax/find_relates.php
иначе поиск похожих новостей с админки, или если выносили его на сайт, не будет работать...

Написал walkman7, 15 января 2011 в 02:41 плохой комментарий   0   хороший комментарий
Новостей: 4, комментариев: 117, Пользователи
Карма: -5±
Поправки такие же, заменить:
(title, short_story, full_story, xfields)

на
(title, short_story)

Написал hawk777, 14 января 2011 в 22:57 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 8, Пользователи
Карма:
А чего мы добиваемся этим запросом?
ALTER TABLE `dle_post` DROP INDEX `short_story` ,
ADD FULLTEXT `short_story` (
`short_story` ,
`title`
)

Написал walkman7, 15 января 2011 в 02:39 плохой комментарий   +1   хороший комментарий
Новостей: 4, комментариев: 117, Пользователи
Карма: -5±
Похожие новости будут выбираться только из заголовка и краткой новости

Написал SADOVNIKde, 14 января 2011 в 23:42 плохой комментарий   +2   хороший комментарий
Новостей: 1, комментариев: 37, Пользователи
Карма:
как я понимаю нововведение ещё сырое?
напишите пожвлуста инструкцию без рассуждений, и что надо делать в файле /engine/ajax/find_relates.php ???
а в целом вещь на мой взгляд полезная,
спасибо!

Написал hawk777, 15 января 2011 в 12:53 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 8, Пользователи
Карма:
Попробуйте так: найти
$db->query( "SELECT id, title, date, category, alt_name, flag, MATCH (title, short_story, full_story, xfields) AGAINST ('$title') as score FROM " . PREFIX . "_post WHERE MATCH (title, short_story, full_story, xfields) AGAINST ('$title') AND approve='1'" . $where . " ORDER BY score DESC, date DESC LIMIT 5" );
и заменить на
$db->query( "SELECT id, title, date, category, alt_name, flag, MATCH (title, short_story) AGAINST ('$title') as score FROM " . PREFIX . "_post WHERE MATCH (title, short_story) AGAINST ('$title') AND approve='1'" . $where . " ORDER BY score DESC, date DESC LIMIT 5" );



Написал SADOVNIKde, 15 января 2011 в 15:07 плохой комментарий   -2   хороший комментарий
Новостей: 1, комментариев: 37, Пользователи
Карма:
ещё больше в тупик поставил ты меня своим ответом.
прочитал весь пост несколько раз, и так и не пойму, что надо делать, а что не надо, тоесть чтото тут просто рассуждения, которые можно пропустить...
я прав?

напишите пожалуста инструкцию, от и до, без попробуйте и анализа.
спасибо.

Написал hawk777, 15 января 2011 в 20:07 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 8, Пользователи
Карма:
чего непонятного то? Вы же спрашивали про engine/ ajax/ find_relates.php, открываете его, ищете
$db->query( "SELECT id, title, date, category, alt_name, flag, MATCH (title, short_story, full_story, xfields) AGAINST ('$title') as score FROM " . PREFIX . "_post WHERE MATCH (title, short_story, full_story, xfields) AGAINST ('$title') AND approve='1'" . $where . " ORDER BY score DESC, date DESC LIMIT 5" );
и заменяете на
$db->query( "SELECT id, title, date, category, alt_name, flag, MATCH (title, short_story) AGAINST ('$title') as score FROM " . PREFIX . "_post WHERE MATCH (title, short_story) AGAINST ('$title') AND approve='1'" . $where . " ORDER BY score DESC, date DESC LIMIT 5" );
иначе не будет работать поиск похожих новостей в админке

Написал димон, 15 января 2011 в 15:51 плохой комментарий   0   хороший комментарий
Новостей: 2, комментариев: 59, Пользователи
Карма: -1±

Цитата: SADOVNIKde
напишите пожалуста инструкцию, от и до, без попробуйте и анализа.

+1 smile

Написал n0wheremany, 15 января 2011 в 17:09 плохой комментарий   0   хороший комментарий
Новостей: 10, комментариев: 107, Пользователи
Карма:
напишите пожалуста инструкцию, от и до, без попробуйте и анализа.


Там же написано


по этому я сделал FULLTEXT поиск только для названия новости и краткой новости:
ALTER TABLE `dle_post` DROP INDEX `short_story` ,
ADD FULLTEXT `short_story` (
`short_story` ,
`title`
)


и поменял
WHERE MATCH (title, short_story, full_story, xfields)
на
WHERE MATCH (title, short_story)

Написал li4nost, 15 января 2011 в 18:44 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 11, Пользователи
Карма:
я думаю SADOVNIKde хотел все по пунктам.
правим файл такой-то. ищем это, удаляем это. запрос делаем такой-то.
не все разбираются в этом всем на таком уровне как вы и другие.

Написал dark666, 15 января 2011 в 17:47 плохой комментарий   0   хороший комментарий
Новостей: 2, комментариев: 116, Пользователи
Карма:
Так вот где собака зарыта, спасибо! friends
Порой с ужасом наблюдаю как "крах"тит mysql по ssh, и что ему над...посмотрим! 59

Написал SADOVNIKde, 15 января 2011 в 18:58 плохой комментарий   0   хороший комментарий
Новостей: 1, комментариев: 37, Пользователи
Карма:
а как же вся информация после слова
Выводы:

Написал Bomberman, 15 января 2011 в 19:35 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 171, Пользователи
Карма:
Цитата: hawk777
А чего мы добиваемся этим запросом?
ALTER TABLE `dle_post` DROP INDEX `short_story` ,
ADD FULLTEXT `short_story` (
`short_story` ,
`title`
)

Удаляется индекс поля `short_story`. Оно перестаёт индексироваться.

Написал SADOVNIKde, 16 января 2011 в 00:02 плохой комментарий   0   хороший комментарий
Новостей: 1, комментариев: 37, Пользователи
Карма:
такое чуство что автор новости и все гуру сайта упорно проходят мимо...
или просто заходят в новость чтобы поржать с чайников.

Написал li4nost, 16 января 2011 в 11:10 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 11, Пользователи
Карма:
правильно ли я понял:

в файле show.full.php найти
$body = $db->safesql( strip_tags( stripslashes( $metatags['title'] . " " . $body ) ) );

заменить на
$body = $db->safesql( strip_tags( stripslashes( $metatags['title'] ) ) );

в том же файле найти и удалить
if( strlen( $row['full_story'] ) < strlen( $row['short_story'] ) ) $body = $row['short_story'];
else $body = $row['full_story'];

Написал li4nost, 16 января 2011 в 11:15 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 11, Пользователи
Карма:
потом провести изменения в /engine/ajax/find_relates.php как написал hawk777 выше. а надо делать запрос к базе?

Написал hawk777, 16 января 2011 в 11:16 плохой комментарий   +1   хороший комментарий
Новостей: 0, комментариев: 8, Пользователи
Карма:
и выполнить запрос
ALTER TABLE `dle_post` DROP INDEX `short_story` ,
ADD FULLTEXT `short_story` (
`title`
)
и поиск похожих новостей будет производиться по названию новости

Смотрите http://forum.4dle.ru/topic12756.html, там более подробно

Написал shra, 19 января 2011 в 05:08 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 1, Пользователи
Карма:
Подскажите как сделать dle 9, чтоб быстрый поиск осуществлялся с первой буквы, а не с четвертой?

Кстати автору спасибо на 9.2 все работает безупречно!

Написал akm16, 23 февраля 2011 в 23:21 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 16, Пользователи
Карма:
А нужно ли это тебе?
Зачем же тебе поиск с первой буквы? Хочешь увеличить нагрузку на базу данных и увеличить трафик?

А добьешся всего-то: красивое и быстрое отображение возможных совпадений!

Написал kabmir, 19 января 2011 в 14:53 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 31, Пользователи
Карма: -2±
ОФФ. ОТВЕТ РАЗРАБОТЧИКА ДЛЕ:
Конечно известно, поиск похожих новостей это тяжелый поиск, то что написано в этой статье существенно снижает качество найденных похожих новостей.

---

всем понятно?

Написал walkman7, 20 января 2011 в 22:48 плохой комментарий   0   хороший комментарий
Новостей: 4, комментариев: 117, Пользователи
Карма: -5±
da eto tak, po etomu ja ostavil sebe tol'ko poisk po kratkoj i nazvanii.

Tak kak na sajte kratkaja i polnaja novosti pochti identichny.

Написал viva812, 19 января 2011 в 22:13 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 1, Пользователи
Карма:
Разработчику следовало бы учесть и оценить усилия walkman7. По сути он спас DLE для больших ресурсов. Потому что многие отказывались от скрипта именно по причине больших нагрузок для больших ресурсов, когда даже выделенные серваки не спасают. Огромное спасибо автору данного сообщения. А разработчику надо бы включить данную опцию настроек в качестве обязательной и настраиваемой по желанию пользователя в следующем релизе, если конечно он хочет чтобы DLE использовался на солидных ресурсах.

Написал llipek, 20 января 2011 в 21:01 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 16, Пользователи
Карма:
спасибо автору, давно искал решение...

Написал Yeti, 21 января 2011 в 00:10 плохой комментарий   0   хороший комментарий
Новостей: 1, комментариев: 109, Пользователи
Карма:
шляпа при поиске на сайте

Написал DNBATTACK, 11 марта 2011 в 03:41 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 26, Пользователи
Карма:
ммм ... спасибо за идею ...
У самого возникают такие проблемы, но так как знаний в php пока мало, а хостер ведет себя нормально - оставлю пока по дефолту ...

Написал _Yuriy_, 29 августа 2011 в 13:35 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 4, Пользователи
Карма:
У меня такая вот фигня. отключил почти все что может отправлять запросы на БД (архивы, календарь, похожие новости и т.д), а у меня всеравно 15 запросов к базе при обновлении страници.
Я даже в шаблоне main.tpl весь код убрал и обновил страницу и всеравно 15 запросов к базе. Ума не приложу откуда оно берется.
Подскажите, пожалуйста, если кто знает.

Написал postalmvc, 21 октября 2011 в 02:24 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 5, Пользователи
Карма:
Это все надо писать разработчикам дле, пускай они парят свою голову над этим ворпросом, и в новых версиях реализуют.

Написал 812xp, 24 ноября 2012 в 15:20 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 1, Пользователи
Карма:
Хотелось бы узнать реализовано ли данное решение в новых версиях. если нет какие изменения в новых версиях надо произвести чтобы данное решение работало?

Информация



Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.
Анализ Тиц и PR сайта

[removed][removed] [removed] (adsbygoogle = window.adsbygoogle || []).push({}); [removed]