Крот
Новичок
Как оптимизировать получение related'ов к книге по авторам, тэгам?
Привет. У меня возник небольшой затык...
Итак, есть сущность - книга. Книге сопоставляются тэги, для этого сделана таблица (тип myisam).
tags2books
tag_id INT INDEX
book_id INT INDEX
Для получения "релейтедов" выполняю вот такие запросы
SELECT book_id FROM tags2books WHERE tag_id IN (SELECT tag_id FROM tags2books WHERE book_id = '5862') AND book_id != '5862';
Очень смущает вот такая запись в логе медленных запросов мускуля.
Подскажите пожалуйста, как можно уменьшить это число и тем самым ускорить запрос?
Поля сделаны индексами, т.е. без индексов вообще нереальное кол-во rows examined было.
Мои мысли: Может быть стоит отказаться от оператора IN в пользу цикла с менее затратными запросами? Это еще вдобавок позволит сделать настоящий релейтед, а не какой-то "рандом". Под настоящим релейтедом я понимаю - сперва получаение книг, у которых все тэги совпадают, потом совпает n-1 тэг и т.д.
Очень хотелось бы услышать мнения.
Спасибо!
-~{}~ 20.10.09 17:37:
Или может быть вообще есть какой-то более рациональный способ получения\организации related'ов.
Привет. У меня возник небольшой затык...
Итак, есть сущность - книга. Книге сопоставляются тэги, для этого сделана таблица (тип myisam).
tags2books
tag_id INT INDEX
book_id INT INDEX
Для получения "релейтедов" выполняю вот такие запросы
SELECT book_id FROM tags2books WHERE tag_id IN (SELECT tag_id FROM tags2books WHERE book_id = '5862') AND book_id != '5862';
Очень смущает вот такая запись в логе медленных запросов мускуля.
А именно - смущает кол-во rows examined.# Query_time: 0 Lock_time: 0 Rows_sent: 321 Rows_examined: 20789
SELECT book_id FROM tags2books WHERE tag_id IN (SELECT tag_id FROM tags2books WHERE book_id = '5862') AND book_id != '5862';
Подскажите пожалуйста, как можно уменьшить это число и тем самым ускорить запрос?
Поля сделаны индексами, т.е. без индексов вообще нереальное кол-во rows examined было.

Мои мысли: Может быть стоит отказаться от оператора IN в пользу цикла с менее затратными запросами? Это еще вдобавок позволит сделать настоящий релейтед, а не какой-то "рандом". Под настоящим релейтедом я понимаю - сперва получаение книг, у которых все тэги совпадают, потом совпает n-1 тэг и т.д.
Очень хотелось бы услышать мнения.
Спасибо!
-~{}~ 20.10.09 17:37:
Или может быть вообще есть какой-то более рациональный способ получения\организации related'ов.