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_size
和 read_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 堡垒主机连接到 MySQL RDS 实例