我有一个包含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)
答案 0 :(得分:3)
高IO率通常表示内存不足或缓冲区太小。一个3GB的表,包括索引,应该完全适合(少于)500美元每月专用服务器的内存。
MySQL有许多不同的缓冲区,并且many parameters可以摆弄。以下缓冲区是最重要的,在两种环境中比较它们的大小:
如果InnoDB:innodb_buffer_pool_size
如果MyISAM:key_buffer_size
和read_buffer_size
答案 1 :(得分:0)
如果没有在FULLTEXT index
列添加body
,那么请尝试一下,这肯定会产生很大的影响
ALTER TABLE `table_name` ADD FULLTEXT INDEX `bodytext` (`body`);
希望有所帮助
答案 2 :(得分:0)
试试这个
SELECT count(1)
FROM table_name WHERE id=97
AND match(body) against ('+data +big' IN BOOLEAN MODE)
这应该加快一点,因为你不必只计算行的所有列。
你可以发布解释本身吗?
答案 3 :(得分:0)
由于数据库版本,表,索引和执行计划相同,因此您需要比较计算机/群集配置。主要比较CPU可用功率,单个事务中使用的内核,存储读取速度,内存大小和读取速度/频率。我可以看到亚马逊提供了各种配置,因此私有集群可能比Amazon RDS实例配置更强大。
要添加到上面,您可以调整CPU,IO和内存之间的负载以提高吞吐量。
答案 4 :(得分:0)
对()使用match()可以在整个3GB全文索引中进行研究,在这种情况下无法强制使用其他索引。
要加快查询速度,您需要让全文索引更轻松,以便:
1 - 清除全文索引中的所有无用字符和停用词
2 - 创建多个全文索引并查看相应的
3 - 将全文搜索更改为LIKE子句并强制使用其他索引,例如'id'。
答案 5 :(得分:0)
尝试在文本索引中放置id并说:
match(BODY,ID) against (+big +data +97) and id=97
您也可以轻松查看可与MySQL一起使用的sphinx。