我有一个包含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秒
答案 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链接: