MySQL 查询速度慢,带有 FULLTEXT 索引



我有 1 个 MyISAM 表,有 620,000 行。 我在具有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上有一个全文索引,在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 秒

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

的,缓存很可能是 30 秒变成 1 秒的原因。

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

如果完全运行MyISAM,您是否key_buffer_size设置为可用RAM的20%左右? 如果您比这低(或高)得多,则可能会导致性能问题。

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

当表的大小超过300,000时,MySQL处理FULLTEXT的能力受到一定限制。如果您使用非常常见的单词作为搜索关键字,例如(通常标记为停用词的in,the,of等),情况会更糟。我建议使用Sphinx全文搜索/Apache Lucene

堆栈溢出链接:

两者的比较

更多比较

最新更新