Вопрос по mysql, full-text-indexing, full-text-search – MySQL - любой способ помочь полнотекстовый поиск с другим индексом?

5

Допустим, у меня есть "статьи" таблица, в которой есть столбцы:

article_text:  fulltext indexed
author_id:     indexed

Теперь я хочу найти термин, который встречается в статье, написанной конкретным артистом.

так что-то вроде:

select * from articles 
where author_id=54 
and match (article_text) against ('foo');

объяснение этого запроса говорит мне, что mysql будет использовать только полнотекстовый индекс. Я полагаю, что mysql может использовать только 1 индекс, но это, кажется, мудрая идея - получить все статьи, которые конкретный автор написал в первую очередь, перед полнотекстовым поиском по термину ... Так есть ли способ помочь mysql?

например .. если вы сделали самостоятельное присоединение?

select articles.* from articles as acopy 
                  join articles on acopy.author_id = articles.author_id 
where 
    articles.author_id = 54 
and match(article_text) against ('foo');

В объяснении для этого сначала указывается использование индекса author_id, а затем полнотекстовый поиск.

Означает ли это, что он выполняет только полнотекстовый поиск по ограниченному набору, отфильтрованному по author_id?

ADDENDUM

Объясните план самостоятельного объединения следующим образом:

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: acopy
         type: ref
possible_keys: index_articles_on_author_id
          key: index_articles_on_author_id
      key_len: 5
          ref: const
         rows: 20
     filtered: 100.00
        Extra: Using where; Using index
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: articles
         type: fulltext
possible_keys: index_articles_on_author_id,fulltext_articles
          key: fulltext_articles
      key_len: 0
          ref: 
         rows: 1
     filtered: 100.00
        Extra: Using where
2 rows in set (0.00 sec)
нет, не ноль всегда лучше Sebas
проверьте, является ли столбец author_id обнуляемым или нет Sebas
это не обнуляемо (что я думаю лучше для этого случая .. но если нет, я, конечно, могу сделать это обнуляемым тоже) ggez44

Ваш Ответ

1   ответ
0

Index Merge is not applicable to full-text indexes

http://dev.mysql.com/doc/refman/5.0/en/index-merge-optimization.html

Я бы попробовал этот подход :( заменитьauthor_id_index по названию вашего индекса на author_id)

select * from articles use index (author_id_index)
where author_id=54 
and match (article_text) against ('foo');

Здесь проблема заключается в следующем:

it is indeed impossible to use a regular index in combination with a full-text index if you join the table with itself, you are using an index already on each side of the join (the ON clause will use the author_id column, you definetly need the index here)

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

какой объем ваших таблиц вы использовали для теста?
Согласно тому, что говорит MySQL документ, он будет использовать только один индекс для ссылки на таблицу. Предложение where считается принадлежащим ссылке на таблицу, поэтому мы не можем говорить оresulting filtered set, Предложение where оценивается до того, как мы получимresulting filtered set... Мне было бы любопытно увидеть план объяснения.
добавил план объяснения .. также да, я говорил оresulting filtered set на уровне базы данных .. зависит только от порядка, в котором mysql пытается выполнить поиск .. план, который он попытался объяснить, если хотите =) ggez44
Спасибо @Sebas. поэтому слияние индекса будет необходимо только в том случае, если у вас есть ваше предложение или первоначальный способ написания запроса. однако, при самостоятельном объединении теоретически индекс author_id будет просто использоваться для объединения совпадающих строк в 2 таблицах ... тогда, мы надеемся, что полный текст будет работать с результирующим фильтрованным набором? ggez44

Похожие вопросы