[英]MySQL Full text search extremely slow on a AWS RDS large instance
我有一个有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
如果没有在body
列上添加FULLTEXT index
然后尝试这个,肯定会产生很大的不同
ALTER TABLE `table_name` ADD FULLTEXT INDEX `bodytext` (`body`);
希望能帮助到你
试试这个
SELECT count(1)
FROM table_name WHERE id=97
AND match(body) against ('+data +big' IN BOOLEAN MODE)
这应该加快一点,因为你不必只计算行的所有列。
你可以发布解释本身吗?
由于数据库版本,表,索引和执行计划相同,因此您需要比较机器/群集配置。 主要比较CPU可用功率,单个事务中使用的内核,存储读取速度,内存大小和读取速度/频率。 我可以看到亚马逊提供了各种配置,因此私有集群可能比Amazon RDS实例配置更强大。
要添加到上面,您可以调整CPU,IO和内存之间的负载以提高吞吐量。
对()使用match()可以在整个3GB全文索引中执行研究,在这种情况下无法强制使用其他索引。
要加快查询速度,您需要使全文索引更轻松,以便您可以:
1 - 清除全文索引中的所有无用字符和停用词
2 - 创建多个全文索引并查看相应的索引
3 - 将全文搜索更改为LIKE子句并强制使用其他索引,例如“id”。
尝试在文本索引中放置id并说:
match(BODY,ID) against (+big +data +97) and id=97
您也可以查看可以轻松与MySQL一起使用的sphinx。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.