Я не понимаю этого.
У меня есть таблица с этими индексами
PRIMARY post_id
INDEX topic_id
FULLTEXT post_text
Таблица имеет (только) 346 000 строк. Я пытаюсь выполнить 2 запроса.
SELECT post_id
FROM phpbb_posts
WHERE topic_id = 144017
AND post_id != 155352
AND MATCH(post_text) AGAINST('http://rapidshare.com/files/5494794/photo.rar')
занимает 4,05 секунды
SELECT post_id
FROM phpbb_posts
WHERE topic_id=144017
AND post_id != 155352
AND post_text LIKE ('%http://rapidshare.com/files/5494794/photo.rar%')
занимает 0,027 секунды.
EXPLAIN показывает, что единственная разница заключается в возможном fulltext
ключе (включая post_text, LIKE
нет)
Это действительно странно.
Что за этим стоит? Что происходит на заднем плане? Как может LIKE
быть так быстро, когда не используется индекс, а FULLTEXT так медленно, когда используется его индекс?
Update1:
На самом деле теперь это занимает около 0,5 секунд, может быть, таблица была заблокирована, но, тем не менее, когда я включаю профилирование, это показывает, что ИНИЦИАЛИЗАЦИЯ FULLTEXT заняла 0,2 секунды. Что происходит?
Я могу запросить мою таблицу с LIKE
10x в секунду, с полным текстом только 2x
UPDATE2:
Сюрприз!
mysql> SELECT post_id FROM phpbb_posts WHERE post_id != 2 AND topic_id = 6 AND MATCH(post_text) AGAINST ('rapidshare.com');
Empty set (0.04 sec)
поэтому я спрашиваю, как это возможно?
Дополнительно,
SELECT count(*) FROM phpbb_posts WHERE MATCH(post_text) AGAINST ('rapidshare.com')
действительно медленно. Может быть полный текст какой-нибудь сломан?
Update3:
Что за черт?
SELECT forum_id, post_id, topic_id, post_text FROM phpbb_posts WHERE MATCH(post_text) AGAINST ('rapidshare.com') LIMIT 0, 30;
занимает 0,27 с в то время как
SELECT count(*) FROM phpbb_posts WHERE MATCH(post_text) AGAINST ('rapidshare.com') LIMIT 0, 30;
занимает больше 30 секунд! Что здесь не так?