我有一个包含两列的表:"用户"有一个全文索引," 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)
答案 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;