Подтвердить что ты не робот

Выполнение запросов LIKE в многомиллионных таблицах строк, MySQL

От кого-то с реальным опытом, как запросы LIKE выполняются в MySQL на многомиллионных таблицах строк с точки зрения скорости и эффективности, если поле имеет простой INDEX?

Есть ли лучшая альтернатива (которая не фильтрует результаты, как правило 50% FULLTEXT) для выполнения поиска полей базы данных на многомиллионных таблицах строк?

Пример:

Schema (comments table)

id (PRIMARY) title(INDEX) content time stamp

Query

SELECT * FROM 'comments' WHERE 'title' LIKE '%query%'
4b9b3361

Ответ 1

От кого-либо, у кого есть реальный опыт, как LIKE-запросы выполняются в MySQL в многомиллионных таблицах строк с точки зрения скорости и эффективности, если поле имеет простой INDEX?

Не так хорошо (я думаю, что у меня были поисковые запросы в диапазоне 900 КБ, не могу сказать, что у меня есть опыт в многомиллионных LIKE).

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

Кроме того, в некоторых случаях использования Веб можно реально улучшить производительность и пользовательский интерфейс с помощью некоторых трюков, таких как индексирование отдельных ключевых слов и создание таблицы ключевых слов и таблицы rows_contains_keyword (id_keyword, id_row). Таблица ключевых слов используется с AJAX, чтобы предлагать условия поиска (простые слова) и компилировать их в целые числа - id_keywords. В этот момент поиск строк, содержащих эти ключевые слова, становится очень быстрым. Обновление таблицы по одной строке за один раз также довольно показательно; конечно, пакетные обновления становятся определенными "не делают".

Это не так похоже на то, что уже сделано полный текст MATCH..IN BOOLEAN MODE, если используется только оператор +:

SELECT * FROM arts WHERE MATCH (title) AGAINST ('+MySQL +RDBMS' IN BOOLEAN MODE);

Вероятно, вам нужна таблица InnoDB:

Логические полнотекстовые поисковые запросы имеют следующие характеристики:

  • Они автоматически не сортируют строки в порядке уменьшения релевантности....
  • Таблицы InnoDB требуют индекса FULLTEXT для всех столбцов выражения MATCH() для выполнения булевых запросов. Булевы запросы к поисковому индексу MyISAM могут работать даже без индекса FULLTEXT, хотя поиск, выполненный таким образом, будет довольно медленным....
  • Они не используют порог 50%, который применяется к поисковым индексам MyISAM.

Можете ли вы дать больше информации о конкретном случае?

Ответ 2

LIKE выполнит полное сканирование таблицы, если у вас есть % в начале шаблона.

Вы можете использовать FULLTEXT в булевом (а не естественном) режиме, чтобы избежать правила 50%.

Логические полнотекстовые поисковые запросы имеют следующие характеристики:

Они не используют порог 50%.

http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html

Ответ 3

Я рекомендую вам также ограничить свой запрос другими предложениями (например, диапазон дат), поскольку LIKE '%something' гарантирует полное сканирование таблицы