mySQL全文索引会减慢查询

时间:2018-03-20 13:08:40

标签: mysql indexing full-text-indexing

我有一个包含两列的表:"用户"有一个全文索引," x"是一个简单的int列。该表包含不到200万条目。使用match...against选择包含特定用户的行会快速返回。

按x的值搜索(未编入索引)在~3秒内返回。

但是,当我将两者结合起来时,查询需要~9秒!如果有的话,我希望合并后的查询花费的时间要少得多,因为全文索引会将可能的行减少一个数量级。即使忘记全文索引并使用like "%___%"也更快!

这里发生了什么?我该如何解决?

mySQL输出包含在下面:

mysql> desc testing;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| users | varchar(120) | YES  | MUL | NULL    |       |
| x     | int(11)      | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> select count(*) from testing;
+----------+
| count(*) |
+----------+
|  1924272 |
+----------+
1 row in set (3.56 sec)

mysql> select count(*) from testing where match(users) against("shy");
+----------+
| count(*) |
+----------+
|   149019 |
+----------+
1 row in set (0.42 sec)

mysql> select count(*) from testing where x>0;
+----------+
| count(*) |
+----------+
|  1924272 |
+----------+
1 row in set (3.62 sec)

mysql> select count(*) from testing where match(users) against("shy") and x>0;
+----------+
| count(*) |
+----------+
|   149019 |
+----------+
1 row in set (8.82 sec)

mysql> select count(*) from testing where users like "%shy%" and x>0;
+----------+
| count(*) |
+----------+
|   149019 |
+----------+
1 row in set (3.57 sec)

2 个答案:

答案 0 :(得分:1)

始终检查innodb_buffer_pool_size的值,并根据系统的功能和软件要求进行调整。这意味着不要给MySQL提供比你更多的RAM:)

如果索引不适合内存,MySQL会将其从磁盘读取,从而限制硬盘的速度。如果你使用SSD,这可能是好的,但是在机械驱动器上它会像蜗牛一样缓慢。

如果索引不能适合RAM,那么它们就不那么有用了。

答案 1 :(得分:0)

考虑使用子查询,例如

select count(*) from (

    select * 

    from testing 

    where match(users) against("shy")

) shy_results 

where x>0;