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

标签 mysql database performance

我有 1 个包含 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秒

最佳答案

MySQL 会先做全文搜索,然后查找其余信息,按价格过滤,按价格排序,最后交付 30。这个过程基本上没有办法缩短。

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

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

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

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

关于使用 FULLTEXT 索引的 MySQL 查询速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35893313/

相关文章:

database - 如何在一个数据库字段中插入多个条目

ruby-on-rails - 使用集群扩展——最佳策略

c++ - 性能:类的 vector 或包含 vector 的类

python - 加快 Pandas 中 csv 文件的条件行读取速度?

php - 搜索MySQL数据库表,按SUM对结果排序

mysql - 由于在 MySQL 中使用保留字作为表名或列名而导致的语法错误

sql - DB2 字段值替换

mysql - 如何通过多个 JOIN 提高查询性能

mysql - 在 MySQL 中,如何在子查询中创建 JOIN?

php - 检索页面内的连接 : PDO and PHP class