我有 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/