我不明白这一点。
我有一张带有这些索引的表
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显示唯一的区别是possible_keys(fulltext
包括post_text,LIKE
没有)
真的很奇怪
这背后是什么?后台发生了什么事?LIKE
不使用索引时怎么能这么快,而使用FULLTEXT时却那么慢呢?
UPDATE1:
实际上,现在大约需要0.5秒,也许表已锁定,但是,当我打开分析时,它表明FULLTEXT INITIALIZATION花费了0.2秒。这是怎么回事?
我LIKE
每秒查询表10次,全文查询2次
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秒!这是怎么了?
两次运行之间的响应时间是否一致?我很容易想到磁盘缓存可能正在发挥作用,其中第一个“慢速”测试将所有需要的数据加载到ram中,因此第二个“快速”查询速度很快。
—
atxdba 2012年
仅使用SQL_NO_CACHE测试查询。
—
mgutt 2015年
这是很老的问题/答案。从那以后,mysql / mariadb有什么进步?
—
罗曼·苏西
警告:此次问答的时间表明它仅是在谈论MyISAM。它对InnoDB的适用性尚存疑问。
—
瑞克·詹姆斯
@RomanSusi-您想针对InnoDB提出一个新问题吗?
—
瑞克·詹姆斯