Оптимизация Fulltext поиска в MySQL

12
Metal Messiah
На сайте с 01.08.2010
Offline
152
1237

Доброй ночи!

Под статьей выводится блок похожих статей по теме (ссылки).

Было когда-то давно через LIKE, потом переделал через fulltext / against.

Сейчас база чуть выросла и такой поиск занимает 10 секунд и выше, что существенно увеличивает время загрузки страницы. Что посоветуете с этим делать?

Отдельную таблицу создать и кешировать в ней на некоторое время результаты поиска похожих статей? С имеющейся больше ничего нельзя сделать для ускорения?

CREATE TABLE IF NOT EXISTS `news` (
`id` int(8) unsigned NOT NULL AUTO_INCREMENT,
`date` int(4) unsigned DEFAULT NULL,
`section` int(1) unsigned DEFAULT NULL,
`title` varchar(255) DEFAULT NULL,
`text` text,
...
PRIMARY KEY (`id`),
KEY `section` (`section`),
FULLTEXT KEY `title` (`title`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=423210 ;


SELECT * FROM news WHERE MATCH (title) AGAINST ('isis вернулась воевавшая домой израильтянка') AND id<>100 ORDER BY date DESC LIMIT 10
anonymous, думай что говоришь и не забывай подписать отзыв :)
lutskboy
На сайте с 22.11.2013
Offline
172
#1

кешировать похожие статьи либо в бд прописать для самой статьи id похожих а при последующих запросах выводить уже готовые похожие по id а не делать каждый раз фуллтекст поиск

Сейчас база чуть выросла и такой поиск занимает 10 секунд

на сколько выросла что поиск занимает 10 сек?

возможно хостинг сменить нужно

alexbalance
На сайте с 17.02.2012
Offline
57
#2
Metal_Messiah:
Что посоветуете с этим делать?

поставить на сайт поиск от Яндекса или Гугла ))) а если это не подходит то посмотрите эту статью по оптимизации MYSQL http://code.tutsplus.com/tutorials/top-20-mysql-best-practices--net-7855

Metal Messiah
На сайте с 01.08.2010
Offline
152
#3

Ну сейчас AUTO_INCREMENT=423210, раньше помню когда было 200к записей. Не помню когда именно менял алгоритм, возможно как раз когда было 200к.

Хостинг врядли. Двиг писался больше 6 лет назад, опыта было мало, хостил на хостинге за $1 в месяц. Когда меня оттуда турнули за нагрузку пару лет назад я перебрался сразу на VPS - база загнулась за пол часа после переезда, после чего я все максимально оптимизировал что мог. На серваке еще ресурсы есть, кроме этого сайта там еще несколько, при этом нагрузка CPU не 100%. Не думаю что нужно менять хостинг.

Единственное что я пока не понимаю - раньше было 10к в сутки посетителей, но с начала года Яндекс что-то мутит и с февраля у меня 1-2к, а тормоза жестче стали.

ОК, так и думал что нужно результаты поиска кешировать на скажем пару суток, чтобы новые статьи в "похожие" добавлялись, но поиск шел по индексам и нагрузка была меньше. Для самой статьи нет, только в отдельную таблицу. Просто очень не хочу делать теги как в DLE - мне такая реализация не нравится.

Поиск от Яндекса ерунда, чтобы он был актуален нужно быстрое попадание в индекс чего сейчас нет.

Указанную статью когда-то читал, половина из этого уже применяется.

Хелпзонович
На сайте с 15.06.2005
Offline
133
#4

поставить sphinx и не мучать mysql. Или эта беда на хостинге?

Вы там держитесь! Хорошего вам настроения. Здоровья.
Metal Messiah
На сайте с 01.08.2010
Offline
152
#5

Из базуки по воробьям... Обычный поиск по сайту, зачем там сложные поисковые движки.

Это не главное, я изначально говорил о подборе похожих новостей по теме.

---------- Добавлено 03.10.2015 в 15:50 ----------

Еще один вопрос, позволю себе задать тут же, хотя тема другая.

В каждой категории идет постраничный вывод новостей от новых к старым. Как уменьшить время запросов вида

SELECT * FROM news WHERE section=1 ORDER BY id DESC LIMIT 86540,20

для очень больших номеров страниц?

lutskboy
На сайте с 22.11.2013
Offline
172
#6

SELECT * FROM table JOIN (SELECT id FROM table ORDER BY id LIMIT 1000000, 10) as b ON b.id = table.id

totamon
На сайте с 12.05.2007
Offline
437
#7
Metal_Messiah:
для очень больших номеров страниц?

какое значение номер страницы может иметь на время запроса? БД без разницы откуда делать выборку из начала таблицы или из конца, главное чтобы у вас нормальные индексы были прописаны.

---------- Добавлено 03.10.2015 в 20:48 ----------

Metal_Messiah:
Из базуки по воробьям...

это про использование fulltext для вывода похожих новостей)

Домены и хостинг https://8fn.ru/regru | Дедик от 3000р https://8fn.ru/73 | VPS в Москве https://8fn.ru/72 | Лучшие ВПС, ТП огонь, все страны! https://8fn.ru/inferno | ХОСТИНГ №1 РОССИИ https://8fn.ru/beget
Metal Messiah
На сайте с 01.08.2010
Offline
152
#8

С "читайте также" разобрался, через пару дней сравню среднюю нагрузку с прошлым периодом.

какое значение номер страницы может иметь на время запроса?

Грубо говоря 5000 страниц по 20 постов на страницу дают то самое значение индекса из запроса. У меня свой лог медленных запросов, включающий время запроса, адрес запрошенной страницы, сам запрос и еще много чего. В нем полно подобных запросов для больших номеров страниц т.е. больших значений индекса.

БД без разницы откуда делать выборку из начала таблицы или из конца

Практика показывает что это не так. Возможно из-за прохода по большому файлу с записями переменной толщины.

главное чтобы у вас нормальные индексы были прописаны

индекс id и категория - все по чему делается WHERE.

SELECT * FROM table JOIN (SELECT id FROM table ORDER BY id LIMIT 1000000, 10) as b ON b.id = table.id

А в чем прикол? Все равно идет чтение индексов из таблицы с динамическим размером записи, а потом по этим индексам подтягиваются остальные поля.

N
На сайте с 06.05.2007
Offline
419
#9

Ну попробуйте для разнообразия optimize table . Обычно это бесполезная операция, но для таких индексов может помочь.

Кнопка вызова админа ()
lutskboy
На сайте с 22.11.2013
Offline
172
#10
SELECT * FROM table JOIN (SELECT id FROM table ORDER BY id LIMIT 1000000, 10) as b ON b.id = table.id

А в чем прикол? Все равно идет чтение индексов из таблицы с динамическим размером записи, а потом по этим индексам подтягиваются остальные поля.

Ну если новостей тысячи то прикол есть. Можете по експерементировать.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий