我有 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
堆栈溢出链接:
两者的比较
更多比较