SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 17.03.2011 20:03:37

Марк
Активист
Зарегистрирован: 31.05.2010
Сообщений: 157

Полнотекстовый индекс по двум и более столбцам

Здравствуйте...
Не могу разобраться с FULLTEXT KEY. Раньше у меня была таблица с одни столбцом и проблем не было...
Сейчас же мне необходимо искать по 4-м столбцам, пример:
`author`, `title`, `publisher`, `isbn`
Как я понял что бы искать по двум столбцам необходимо сделать соответствующий индекс по нескольким столбцам, например (`author`, `title`)
а если мне понадобится (`author`, `isbn`) или (`author`, `publisher`) и т.д, т.е получается куча вариантов...

Пробовал так:


ALTER TABLE `tb`
ADD FULLTEXT KEY (`author`),
ADD FULLTEXT KEY (`title`),
ADD FULLTEXT KEY (`publisher`),
ADD FULLTEXT KEY (`isbn`);

select * from `tb`
where
MATCH(`author`) AGAINST ('+mysql' IN BOOLEAN MODE) or
MATCH(`title`) AGAINST ('+mysql' IN BOOLEAN MODE) limit 0,10;
 

только вот долго выполняется...

Отредактированно Марк (17.03.2011 23:38:22)

Неактивен

 

#2 17.03.2011 21:51:35

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Полнотекстовый индекс по двум и более столбцам

Так работать, разумеется, не будет — при выборе из таблицы Вы можете
использовать только один индекс (будь то полнотекстовый или нет). Соот-
ветственно, одно из условий проверяется по индексу, а остальные —
наживую.

Имеет смысл сделать один индекс на все четыре столбца и искать сразу
по четырем столбцам.

Неактивен

 

#3 18.03.2011 00:23:25

Марк
Активист
Зарегистрирован: 31.05.2010
Сообщений: 157

Re: Полнотекстовый индекс по двум и более столбцам

В том то и всё... необходимо искать например по автору и названию или по isbn и автору)))
Получается придётца сделать так:

ALTER TABLE `tb`
ADD FULLTEXT KEY (`author`),
ADD FULLTEXT KEY (`title`),
ADD FULLTEXT KEY (`publisher`),
ADD FULLTEXT KEY (`isbn`),
ADD FULLTEXT KEY idx1 (`author`,`title`),
ADD FULLTEXT KEY idx2 (`author`,`publisher`),
ADD FULLTEXT KEY idx3 (`author`,`isbn`),
ADD FULLTEXT KEY idx4 (`title`,`publisher`),
ADD FULLTEXT KEY idx5 (`title`,`isbn`),
ADD FULLTEXT KEY idx6 (`publisher`,`isbn`);

Неактивен

 

#4 18.03.2011 03:53:32

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Полнотекстовый индекс по двум и более столбцам

Вы усложняете себе задачу. Точнее — Вы решаете совсем не ту задачу.
Вы придумываете страшные костыли, чтобы заработал полнотекстовый
поиск. Вместо того, чтобы реорганизовать данные так, как они должны
быть по логике. Это общее правило на самом деле — если Вы громоздите
костыли, значит, пора пересмотреть архитектуру.

В ISBN не может быть вбито более одного слова. В автора не
может быть вбито более одного числа. Точнее даже — автора не
должно быть в этой таблице, авторы должны быть в отдельной таблице,
связанной как многие ко многим. Издатель — это тоже одно число.

Из осмысленных вещей для полнотекстового индекса я вижу только
title.

Неактивен

 

#5 18.03.2011 18:17:26

Марк
Активист
Зарегистрирован: 31.05.2010
Сообщений: 157

Re: Полнотекстовый индекс по двум и более столбцам

Дело в том что таблица создаётся каждый день заново и наполняется новыми данными, и даже если я сделаю уникальными записи в столбце `author`и вынесу в отдельную таблицу это всё равно не позволит быстро искать одновременно по автору и названию... в isbn большинство записей имеет более 2 слов
Раньше (автор, название, издатель, isbn) хранились в одном столбце

Неактивен

 

#6 18.03.2011 21:34:28

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Полнотекстовый индекс по двум и более столбцам

Тогда варианта два — или нагромождение разных индексов так, как Вы написали,
или один большой индекс, искать по всем полям, а потом отсеивать дополнительно
на уровне обработки запроса.
Т.е. что-то такое:
SELECT ... FROM (SELECT author, title, ... FROM tb WHERE MATCH ...) WHERE title like '%word%'.

Второе будет работать медленнее, но зато ему хватит одного индекса.

Неактивен

 

#7 18.03.2011 22:37:23

Марк
Активист
Зарегистрирован: 31.05.2010
Сообщений: 157

Re: Полнотекстовый индекс по двум и более столбцам

Спасибо, пробовал второй вариант


SELECT * FROM (
SELECT id, author, title FROM `tb` WHERE MATCH (author,title) AGAINST ('+книга' IN BOOLEAN MODE)
) s
WHERE s.title like '%книга%';

Долго работает, подобно
SELECT * FROM  `tb` WHERE title like '%книга%';

Неактивен

 

#8 19.03.2011 01:32:26

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Полнотекстовый индекс по двум и более столбцам

Только если у Вас почти в каждой второй строке есть слово «книга» )

Как правило, полнотекстовый индекс выбирает очень небольшую часть
данных (например, 1%). В этом случае второй способ может быть эффек-
тивным. Если индекс выбирает много строк — выигрыша не будет.

Неактивен

 

#9 21.03.2011 16:54:53

Марк
Активист
Зарегистрирован: 31.05.2010
Сообщений: 157

Re: Полнотекстовый индекс по двум и более столбцам

После долгих экспериментов пришёл к выводу что предложенный вами вариант лучше.. лепить столько индексов, слишком. Боюсь представить количество индексов с 6-ю столбцами))) тем более есть limit, 5000 записей пользователю больше чем достаточно...
Как можно отключить кэширование, чтобы поэкспериментировать с производительностью?

Отредактированно Марк (22.03.2011 08:31:26)

Неактивен

 

#10 23.03.2011 00:50:02

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Полнотекстовый индекс по двум и более столбцам

Я Вам открою страшную тайну — пользователю достаточно 10, максимум — 25 строк wink
5000 он просто не в состоянии будет прочитать.

SELECT SQL_NO_CACHE ... Вас спасет.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson