我有一个有 1400 万行的表,我正在尝试在这个表上执行全文搜索。对此的查询执行速度非常慢,一个简单的二进制AND
查询大约需要 9 秒。同样的东西会在我的私有集群上立即执行。该表的大小约为 3.1 GB,包含 1400 万行。有人可以解释 RDS 实例的这种行为吗?
SELECT count(*)
FROM table_name WHERE id=97
AND match(body) against ('+data +big' IN BOOLEAN MODE)
我有一个有 1400 万行的表,我正在尝试在这个表上执行全文搜索。对此的查询执行速度非常慢,一个简单的二进制AND
查询大约需要 9 秒。同样的东西会在我的私有集群上立即执行。该表的大小约为 3.1 GB,包含 1400 万行。有人可以解释 RDS 实例的这种行为吗?
SELECT count(*)
FROM table_name WHERE id=97
AND match(body) against ('+data +big' IN BOOLEAN MODE)
高 IO 率通常表示内存不足或缓冲区太小。一个 3GB 的表(包括索引)应该完全适合(远低于)每月 500 美元的专用服务器的内存。
MySQL 有许多不同的缓冲区,以及要摆弄的许多参数。以下缓冲区是最重要的,比较它们在两种环境中的大小:
如果 InnoDB:innodb_buffer_pool_size
如果 MyISAM:key_buffer_size
和read_buffer_size
如果没有,您是否已添加FULLTEXT index
到body
列中,然后尝试这个肯定会产生很大的不同
ALTER TABLE `table_name` ADD FULLTEXT INDEX `bodytext` (`body`);
希望能帮助到你
使用 match() against() 您可以在整个 3GB 全文索引中执行研究,在这种情况下无法强制使用另一个索引。
为了加快查询速度,您需要使全文索引更轻,以便您可以:
1 - 从全文索引中清除所有无用的字符和停用词
2 - 创建多个全文索引并查看适当的索引
3 - 将全文搜索更改为 LIKE 子句并强制使用其他索引,例如“id”。
尝试将 id 放在文本索引中并说:
match(BODY,ID) against (+big +data +97) and id=97
您还可以查看可以轻松与 MySQL 一起使用的 sphinx。
由于 DB 版本、表、索引和执行计划相同,因此需要比较机器/集群配置。比较要点 可用的 CPU 功率、单个事务中使用的内核、存储读取速度、内存大小和读取速度/频率。我可以看到 Amazon 提供了多种配置,所以也许您的私有集群比 Amazon RDS 实例配置更强大。
除此之外,您可以平衡 CPU、IO 和内存之间的负载以增加吞吐量。
尝试这个
SELECT count(1)
FROM table_name WHERE id=97
AND match(body) against ('+data +big' IN BOOLEAN MODE)
这应该会加快速度,因为您不必只计算行数。
你可以发布解释本身吗?