Я цього не отримую.
У мене є таблиця з цими показниками
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
включений пост_текст, LIKE
не так)
Це справді дивно.
Що за цим? Що відбувається на задньому плані? Як можна LIKE
бути настільки швидким, коли не використовується індекс і FULLTEXT, так повільно, коли використовується його індекс?
ОНОВЛЕННЯ1:
Насправді це займає приблизно 0,5 секунди, можливо, таблиця була заблокована, але все ж, коли я включаю профілювання, це показує, що FULLTEXT INITIALIZATION займає 0,2 секунди. Як справи?
Я можу запитувати свою таблицю LIKE
10 разів на секунду, з повним текстом лише 2 рази
ОНОВЛЕННЯ2:
Сюрприз!
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')
дійсно повільно. Можна повний текст будь-якого зламаного?
ОНОВЛЕННЯ3:
Якого біса?
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 секунд! Що тут не так?