使用FULLTEXT索引,MySQL查询速度慢

时间:2016-03-09 13:43:48

标签: mysql database performance

我有一个包含620,000行的MyISAM表。我在具有2GB RAM的双核服务器上运行XAMPP。 Apache作为Windows服务安装,MySQL由XAMPP控制面板控制。

以下查询需要30秒以上才能运行。

select  `id`,`product_name`,`search_price`,`field1`,`field2`,
       `field3`,`field4`
    from  `all`
    where  MATCH (`product_name`) AGAINST ('searchterm')
      AND  `search_price` BETWEEN 0 AND 1000
    ORDER BY  `search_price` DESC
    LIMIT  0, 30 

我在product_name上有一个FULLTEXT索引,在search_price上有一个BTREE,在id上有自动增量

如果我解释上述查询,结果是:

id select_type   table type     possible_keys                       key                   key_len ref rows Extra
1  SIMPLE        all   fulltext search_price,FULLTEXT_product_name  FULLTEXT_product_name 0 NULL 1 Using where; Using filesort

如何加快此查询?它应该在620,000行的桌子上花这么长时间吗?

我刚刚注意到这只发生在数据库暂时没有被查询的情况下,所以我猜测这是与缓存有关,第一个查询需要30多秒,然后如果我第二次尝试查询需要1秒

2 个答案:

答案 0 :(得分:2)

MySQL将首先进行全文搜索,然后查找其余信息,过滤价格,按价格排序,最后交付30.基本上没有办法缩短该过程。

是的,缓存可能是30秒变为1秒的解释。

切换到InnoDB(现在有FULLTEXT)可能会带来一些好处。

如果完全运行MyISAM,您是否将key_buffer_size设置为可用内存的大约20%?如果你比这更低(或更高),可能会导致性能问题。

如果完全运行InnoDB,请将innodb_buffer_pool_size设置为可用RAM的大约70%。

答案 1 :(得分:1)

当表的大小超过300,000时,MySQL处理FULLTEXT的能力有些受限。如果您使用非常常见的单词作为搜索关键字(通常标记为停用词的in,the,of等),它将更糟糕。我建议使用Sphinx Full Text Search / Apache Lucene

Stackoverflow链接:

Comparison of the two

More Comparison