Как стать автором
Обновить

Комментарии 14

Спасибо за статью, узнал несколько новых для себя вещей. Поставил плюсик.
Впечатления, однако, смешанные.
С одной стороны, хорошо что она есть, но с другой — видно, что написана по разнарядке для продвижения блога компании. Хотелось бы большей вовлечённости. Поменьше источников и побольше реальных юзкейсов из собственного опыта.
Не секрет, что explain используется в первую очередь для оптимизации запросов. А этой теме в статье посвящено до обидного мало. Тому, кто уже разбирается, она даст несколько новых подсказок, но тому, кто захочет с ее помощью научиться оптимизировать запросы, будет очень непросто вычленить ключевые моменты.
Желательно структурировать информацию, выделяя более значимую. К примеру, действительно важные значения столбца Extra стоит дать подробнее, а всякие диковины типа impossible having, которые только на бумаге и встречаются, я бы убрал под спойлер.


Чтобы не быть голословным, несколько вещей из собственного опыта


  • надо обращать внимание на размер key length. Если он большой, то стоит подумать над уменьшением. У нас в практике был случай, когда требовалась уникальность для поля, содержащего довольно большой объем данных. Убрав с него индекс и добавив рядом поле, содержащее md5() от этих данных, получили ощутимый прирост производительности.
  • перемножать значения rows надо не "если не лень", а в обязательном порядке. Ну или точнее — следить чтобы там в идеале были единички во всех дополнительных таблицах, поскольку перемножение строк и является основной причиной медленных запросов
  • не нужно переживать из-за Filesort, если значение Rows небольшое и эти действия производятся на финальной стадии — БД вполне может просто отсортировать уже полученный результат прямо в памяти, это никак не повлияет на скорость
  • если запрос очень большой, то я всегда "упрощаю" его, выкидывая из него различные элементы, следя за тем, чтобы ключевые проблемы в EXPLAIN оставались теми же — помогает увидеть самое основное и не отвлекаться на не имеющие значения детали, а так же сформулировать конкретный вопрос для google/stackoverflow
Спасибо за такой подробный комментарий. Если тема интересна сообществу, то буду рад развивать её дальше на примерах собственного опыта.

Эх, ну как тут удержаться от сентенции "Хабр уже не торт"? Статью про "предателя" три дня обсуждают взахлеб, а в статью по тематике, для которой изначально создавался сайт, зашло полтора инвалида.


Но вы все равно пишите. Когда пишешь статью, мысли у самого в голову укладываются лучше, это уже и сам по себе плюс. Ну статья в любом случае не пропадет и будет интересна пусть не тем кто читает хабр за утренним кофе, но тем кто гуглит информацию в интернете.

Оптимизация запроса это конечно хорошо, но она имеет смысл только тогда, когда есть оптимальная конструкция самой БД и таблиц.

А вот как решить задачу оптимизации, например, если нужно делать запросы к FULLTEXT индексу в постоянно нарастающей по объему таблице (и отсечь данные нельзя ни под дате, ни как-либо еще — всегда нужно делать запрос ко всем текстовым данным в таблице, которые каждый день прирастают по сотне тысяч строк текста).

Любой такой запрос подбрасывает расход CPU в 100% пока запрос не получит результат.
Вот это задача номер раз!

Я не встречал на продакшене использования фуллтекст индексов. Полнотекстовый поиск всегда выносится в Сфинкс/Эластик.

Это увеличит нагрузку на CPU на 30% в среднем.
А не встречали, почему?
Вот хабр сейчас использует для поиска похожих статей метки, был-ли раньше полнотекстовый поиск для этого на хабре? (по идее был). Поиск в поле поиска на хабре — что использует? (сфинкс, или другой поиск, который как-то индексирует тексты и затем использует что? — правильно всё те же полнотекстовые индексы).
И это пример с низкой скоростью добавления данных.

А взять риа например — новости каждые 20-30 секунд в БД, и поиск похожих новостей перед добавлением, за год например — как ищутся?

Стоп. Тут какая-то куча-мала из вопросов.
Во-первых, с переходом на отдельный поисковый сервис нагрузка на процессор сервера базы данных нас перестаёт интересовать от слова "совсем". Ну то есть понятно, что если у нас ВДС за три копейки на двух виртуальных ядрах, которые обслуживают и веб и БД и всех демонов впридачу — тогда нагрузка на поиск будет волновать.
Но если у нас система с "приростом по сотне тысяч строк в день", то логично разнести её на разные физические серверы — веб на одном, БД на втором, поиск — на третьем. И пусть себе грузит свой процессор сколько влезет.


Метки вообще никакого отношения к полнотекстовому поиску не имеют, это простой поиск по обычному индексу:


SELECT article_id FROM articles_tags at, tags t 
WHERE at.tag_id=t.id AND t.name IN (...)
GROUP BY article_id 
ORDER BY count(*) DESC

чтобы отсортировать по релевантности


Поиск "похожих новостей" и полнотекстовый поиск — это две большие разницы. Я думаю, для поиска "похожих" надо сначала научиться выделять ключевые слова в тексте. А дальше уже чисто техническая задача.

Нет, не разнесем — может сразу ДЦ купим ради десятка миллионов запсией?
Всё на одном сервере, и внешний поисковый двиг только добавит нагрузку.

Поиск по меткам — как пример, что сейчас есть по меткам, а дальше предположение, что был полнотекст на хабре вначале пути.

«Поиск „похожих новостей“ и полнотекстовый поиск — это две большие разницы» нет, никакие метки вам не дадут гарантии похожести, полнотекст лидирует, либо человек должен проверять глазами выборку после меток.

Полнотекст обязателен для вывода похожих новостей в релевантном поиске (как у гулга например).

Но, сотрудник тех части google — Ubl, в недавней беседе упомянул структуру их индексов поиска (у них обычный индекс текста по словам, такой же в принципе, как создает любая БД), и сказал, что помимо самих индексов у них есть индексы — индексов, и указатели индексов — индексов.
Вот это и интересно. Это решает, как я понимаю, проблему с нагрузкой при полнотекстовом поиске, но как это реализовано у них, пока представить не могу в полной мере.

Как-то немного разнобой получается. По запросам у вас РИА и Гуголь, а по возможностям — один арендованный сервак. Ну в общем, я наверное ничего не смогу посоветовать для вашего случая.

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

Мои вот движки держат легко 120-200 тыс посетителей в стуки даже на одно-двух процессорных вдс за доллар, при этом, обновление данных каждые 20-40 секунд.
И именно потому, что я очень жестко подхожу к борьбе за каждый байт и процессорную операцию при разработке, это уже как азарт просто, само-собой разумеющийся.

Сейчас вот как раз озадачаен решением выше-озвученной задачи для вдс на 2-3 CPU ядра средней линейки.
Ели жестко ограничиваться mysql, то решений не так много:
— выделение ключевых слов/тэгов, вынесение в отдельную таблицу и создание индексов по ним
— хранить тексты в файлах и юзать linux-grep (не знаю насколько быстрее будет)
Т.е. полнотекстовый поиск по большому объему текста в ограниченных условиях CPU врядли решаем.

Если придумаете интересное решение, будем ждать статья на хабре))
Да решений для тестов много, нужно просто правильно подобрать размеры и веса решений.

Вот сейчас откатываю разные размеры партиций и отдельных таблиц, а не партиций и вместо одного — 5-20 запросов, если процент выигрыша будет существенный, это будет очередной костыль, пока не будет найдено протестировано более быстрое и незатратное решение.

Пробую и файловые операции использовать на регэкспах, вместо полнотекста в БД, посмотрим, понюхаем.
Партиции дадут выигрыш, только если вы можете как-то ограничить выборку (т.е. вместо сканирований большой таблицы, сканируем под-таблицы поменьше), но у вас вроде условие всю таблицу сканировать.

Желаю успехов в решении
Не, в партициях ровно просто разделить и делать много запросов, по однму в каждую партицию, узнать разницу между кодом работы партиций и кодом работы с разными таблицами, чтобы увидеть где быстрее.
В любом случае спасибо за напутствие, буду пробовать.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий