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

Posted

技术标签:

【中文标题】AWS RDS 大型实例上的 MySQL 全文搜索速度极慢【英文标题】:MySQL Full text search extremely slow on a AWS RDS large instance 【发布时间】:2013-05-17 04:03:21 【问题描述】:

我有一个包含 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) 

【问题讨论】:

你能比较一下两种环境下的执行计划吗?如果不同,请将它们都发布。 SELECT Explain 在两台机器上显示相同的内容。 由于DB版本、表、索引、执行计划都一样,需要对比机器/集群配置。比较要点 可用的 CPU 功率、单个事务中使用的内核、存储读取速度、内存大小和读取速度/频率。我可以看到亚马逊提供了多种配置,所以也许你的私有集群比 Amazon RDS 实例配置强大得多。 @Stoleg 我同意我的私有集群比 Amazon RDS 强大得多。我可以看到读取 IOPS 和 CPU 利用率在 RDS 上很快达到了限制,这导致了这个问题。看起来这里唯一的方法是迁移到 EC2 上的 Solr 或类似的东西。因为我已经有一个相当昂贵的 RDS 实例,大小为 500 GB,预置 IOPS 为 2000,每月花费大约 550 美元。 【参考方案1】:

高 IO 率通常表示内存不足或缓冲区太小。一个 3GB 的表(包括索引)应该完全适合(远低于)每月 500 美元的专用服务器的内存。

mysql 有许多不同的缓冲区,可以像many parameters 那样摆弄。以下缓冲区是最重要的,比较它们在两种环境中的大小:

如果 InnoDB:innodb_buffer_pool_size

如果 MyISAM:key_buffer_sizeread_buffer_size

【讨论】:

【参考方案2】:

您是否在body 列上添加了FULLTEXT index 如果没有,那么试试这个肯定会有很大的不同

ALTER TABLE `table_name` ADD FULLTEXT INDEX `bodytext` (`body`); 

希望对你有帮助

【讨论】:

【参考方案3】:

试试这个

SELECT count(1) 
FROM table_name WHERE id=97
AND match(body) against ('+data +big' IN BOOLEAN MODE) 

这应该会加快速度,因为您不必只计算行数。

你能发布解释本身吗?

【讨论】:

另外,最小字长是多少?会不会是一个停用词那么大,以至于它只搜索单词数据?【参考方案4】:

由于数据库版本、表、索引和执行计划都相同,因此需要比较机器/集群配置。比较要点 可用的 CPU 功率、单个事务中使用的内核、存储读取速度、内存大小和读取速度/频率。我可以看到亚马逊提供了多种配置,所以也许你的私有集群比 Amazon RDS 实例配置强大得多。

除此之外,您可以平衡 CPU、IO 和内存之间的负载以提高吞吐量。

【讨论】:

【参考方案5】:

使用 match() against() 您可以在整个 3GB 全文索引中执行研究,在这种情况下无法强制使用另一个索引。

为了加快查询速度,您需要使全文索引更轻,以便您可以:

1 - 从全文索引中清除所有无用的字符和停用词

2 - 创建多个全文索引并查看合适的索引

3 - 将全文搜索更改为 LIKE 子句并强制使用其他索引,例如“id”。

【讨论】:

【参考方案6】:

尝试将 id 放在文本索引中并说:

match(BODY,ID) against (+big +data +97) and id=97

您还可以看看可以轻松与 MySQL 一起使用的 sphinx。

【讨论】:

以上是关于AWS RDS 大型实例上的 MySQL 全文搜索速度极慢的主要内容,如果未能解决你的问题,请参考以下文章

如何连接mysql数据库(AWS下的RDS实例)

将 EC2 实例连接到另一个 AWS 账户上的 RDS 卷

从 MySQL 客户端通过 AWS 堡垒主机连接到 MySQL RDS 实例

RDS 实例之间的 AWS 数据管道 (MySQL)

[AWS][数据库]Aurora 动手实验&对比RDS Mysql性能

AWS RDS 实例升级停机时间 [关闭]