2012-02-09 3 views
2

Здравствуйте, у меня есть таблица комментариев, на которой я запускаю полнотекстовый поиск. c1 и c2 являются псевдонимами в той же таблице по критериям: c1.parent_id = 0 Я получаю только вопросы (не ответы на них) и через c2.parent_id <> 0 Я фильтрую вопросы, которые уже имеют ответыМожет ли этот MYSQL быть оптимизирован?

SELECT DISTINCT c1.comment, c1.comment_id, MATCH(c1.comment) AGAINST ('keyword1 keyword2 keyword3') AS score 
    FROM comments AS c1 
     JOIN comments AS c2 
      ON c1.comment_id = c2.parent_id 
    WHERE c1.parent_id=0 
     and c2.parent_id <> 0 
    ORDER BY score DESC LIMIT 9 

проблема заключается в том, что, когда я бегу EXPLAIN SELECT ... поиск смотрит через каждую строку таблицы - так тем больше он получает, тем медленнее эта операция будет, вместо того, чтобы искать только строки с parent_id = 0.

Я хотел бы спросить: возможно ли оптимизировать этот вид запроса?

+0

могли бы вы предоставить полное определение таблицы и EXPLAIN выход? – Wiseguy

ответ

0

добавить индекс всех идентификаторов столбцов

alter table your_table add index(parent_id) 

же с comment_id

+0

хорошо, такой же результат. Я использовал: CREATE INDEX test ON comments (comment_id, parent_id); –

+0

Порядок столбцов очень важен в индексе. Comment_id уникален, я думаю, поэтому комментарии INDEX test ON (comment_id, parent_id) на самом деле мало что делают. Попробуйте предложение hforbess CREATE INDEX test2 ON comments (parent_id), попробуйте новый EXPLAIN и посмотрите, что этот индекс используется сейчас. – greyfairer

+0

Ну, я пробовал только использовать индекс на (parent_id), результат тот же. Из 2000 строк около 700 искали - там, где их нужно отфильтровать до 175. Интересно, что если я буду фильтровать их дальше через c1.category = 'cat1, результат будет около 700, но если фильтр будет через c2.category = 'cat1' mysql проходит через все 2000 строк. –

Смежные вопросы