Когда MySQL перестраивает индекс FTS? - PullRequest
3 голосов
/ 20 сентября 2011

Если вы хотите использовать функциональность MySQL для полнотекстового поиска, вы определяете полнотекстовый индекс для полей с типом VARCHAR. Поскольку строки вставляются и обновляются, mysql должен поддерживать индексы в актуальном состоянии. Мой вопрос: Когда MySQL перестраивает индекс FTS?

  • A) Сразу после ВСТАВКИ или ОБНОВЛЕНИЯ, которые влияют на индекс.
  • B) Когда запускается первый SELECT, для которого требуется индекс, на который недавно повлияло UPDATE или INSERT.
  • C) Что-то еще.

Ненужная справочная информация : Мой опыт, кажется, считает вариант Б. Правильно ли это? Я спрашиваю, потому что у меня возникали внезапные случайные медленные запросы, которые выполняют полнотекстовый поиск, и я не знаю, почему одни медленные, а другие нет. Я догадываюсь, что запросы могут быть медленными, если они ожидают, что mysql перестроит индекс FTS, но я не знаю, так ли это работает в mysql. Пример случайного медленного запроса (обычно тот же запрос выполняется за секунду), в медленном журнале нет медленного UPDATE или INSERT:

# Query_time: 61.775612  Lock_time: 10.110924 Rows_sent: 20  Rows_examined: 222498
SELECT SQL_CALC_FOUND_ROWS id
FROM members
WHERE
    AND MATCH (bio,profile_text,name) AGAINST ('building surveyor')
    AND MATCH (town, postcode, country) AGAINST ('united kingdom, liverpool');

Обратите внимание на время блокировки. Я не вижу никаких других INSERT или UPDATE в медленном журнале, поэтому я не уверен, чего он ждет. Вот почему я догадался, что это может ожидать перестройки индекса FTS?

1 Ответ

1 голос
/ 21 апреля 2015

Попробуйте использовать ... AGAINST('"building surveyor"'), чтобы получить эту фразу вместо этих двух слов, разбросанных в любом месте.

Вы используете MyISAM или InnoDB? Они работают по-разному.

MyISAM, я думаю, обновляет индексы FT при вставке / обновлении строки.

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

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

...