7

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

6 回答 6

4

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

MySQL 有许多不同的缓冲区,以及要摆弄的许多参数。以下缓冲区是最重要的,比较它们在两种环境中的大小:

如果 InnoDB:innodb_buffer_pool_size

如果 MyISAM:key_buffer_sizeread_buffer_size

于 2013-06-15T08:47:58.560 回答
2

如果没有,您是否已添加FULLTEXT indexbody列中,然后尝试这个肯定会产生很大的不同

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

希望能帮助到你

于 2013-05-22T08:24:59.357 回答
0

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

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

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

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

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

于 2013-06-15T19:43:29.883 回答
0

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

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

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

于 2013-06-17T04:13:27.230 回答
0

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

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

于 2013-06-14T21:15:35.523 回答
0

尝试这个

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

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

你可以发布解释本身吗?

于 2013-06-14T11:46:35.400 回答