SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 03.04.2011 15:54:43

jerry
Участник
Зарегистрирован: 31.01.2011
Сообщений: 18

Подскажите как стоит поступать (оптимизация, избыточность)

Есть 3 таблицы

book (id, name, ...) -primary на id и фуллтекст на name
author (id, name, ...) - primary на id и фуллтекст на name
book_to_author (book_id, author_id) - индекс на book_id и индекс на author_id

в таблицах book и author по 100к записей.
в таблице book_to_author 200к записей. То есть в среднем у одной книги по 2 автора и у одного автора по 2 книги.

Есть запрос, который ищет книги, названия или имена авторов которых удовлетворяют условию поиска
SELECT *
FROM book b
LEFT JOIN book_to_author b2a ON ( b.id = b2a.book_id )
LEFT JOIN author a ON ( b2a.author_id = a.id )
WHERE MATCH(b.name) AGAINST('Alexander Pushkin') OR MATCH(a.name) AGAINST('Alexander Pushkin')
LIMIT 0, 30
Запрос выполняется долго. 


Есть ли какая то возможность ускорить его? Или это как раз тот случай, когда не стоит бежать от избыточности и можно продублировать поле author.name в таблицу book (а там и на оба поля составной фуллтекст индекс поставить) ?

Отредактированно jerry (03.04.2011 20:11:51)

Неактивен

 

#2 08.04.2011 20:50:38

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

Re: Подскажите как стоит поступать (оптимизация, избыточность)

По смыслу Вы хотите именно объединения; более того — если объединить в одну
табличку, то Вы получите более релевантные результаты в начале.

С текущим способом хранения данных будет неплохо работать UNION с отдельными
поисками по названию или по автору.

Неактивен

 

Board footer

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