我不明白这个。
我有一个包含这些索引的表
PRIMARY post_id
INDEX topic_id
FULLTEXT post_text
Run Code Online (Sandbox Code Playgroud)
表有(仅)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')
Run Code Online (Sandbox Code Playgroud)
需要 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%')
Run Code Online (Sandbox Code Playgroud)
需要 0.027 秒。
EXPLAIN 显示唯一的区别在于可能的键(fulltext
包含 post_text,LIKE
不包含)
这真的很奇怪。
这背后是什么?后台发生了什么?LIKE
不使用索引时怎么会这么快,而使用它的索引时 FULLTEXT怎么会这么慢?
实际上现在大约需要 0.5 秒,也许表被锁定了,但是,当我打开分析时,它显示 FULLTEXT INITIALIZATION 花了 0.2 秒。这是怎么回事?
我可以LIKE
每秒 10 倍的速度查询我的表格,而全文只有 2 倍
惊喜!
mysql> SELECT …
Run Code Online (Sandbox Code Playgroud) 当我添加一些以布尔模式为条件的单词时,全文匹配忽略了它的索引。选择如下:
explain select * from seeds WHERE MATCH(text) AGAINST ("mount cameroon" IN BOOLEAN MODE);
Run Code Online (Sandbox Code Playgroud)
产出
+----+-------------+-------+----------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+----------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | seeds | fulltext | text | text | 0 | | 1 | Using where |
+----+-------------+-------+----------+---------------+------+---------+------+------+-------------+
Run Code Online (Sandbox Code Playgroud)
具有多个条件词的相同查询
explain select * from seeds WHERE MATCH(text) AGAINST ("mount cameroon" IN BOOLEAN MODE) = 4;
Run Code Online (Sandbox Code Playgroud)
产出
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id …
Run Code Online (Sandbox Code Playgroud)