繁体   English   中英

MySQL在AWS RDS大型实例上进行全文搜索速度极慢

[英]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_sizeread_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM