/ / mysql - някакъв начин да помогнете за пълно търсене с друг индекс? - mysql, индексиране с пълен текст, търсене с пълен текст

mysql - как да помогнете за пълното търсене с друг индекс? - mysql, пълен текстов индекс, пълнотекстово търсене

Нека кажем, че имам таблица „статии“, която съдържа колоните:

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?

ДОПЪЛНЕНИЕ

обяснете план за самосъединението, както следва:

*************************** 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)

Отговори:

0 за отговор № 1

Добре, така, тъй като

Сливане на индекси не е приложимо за пълнотекстови индекси

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");

Тук проблемът е следният:

  • наистина е невъзможно да се използва обикновен индекс в комбинация с индекс с пълен текст
  • ако се присъедините към таблицата със себе си, използвате индекс вече от всяка страна на присъединяването (клаузата ON ще използва колоната author_id, определено имате нужда от индекса тук)

Най-ефикасното трябва да решите от вас, с някои тестови случаи, дали използването на индекса на автора е по-добро от текстовото.