3

我有一张产品表,大约有 3,500,000 件商品。该表在名为 title 的列上有一个全文索引。

以下查询示例最多需要 4 秒,这是完全不可接受的,并且正在寻找优化的方法......感谢想法/建议。

基本上; 哪些列应该被索引,我应该单独拉出这么多列还是拉出所有列更快(总共有 23 列)等等

查询示例:

SELECT PRid, title, Artist, author, actors, imageURL, prodcat, lowprice,
highprice, prodcatID, description from products where
((MATCH(title) AGAINST ('+blue +top' IN BOOLEAN MODE))) order by
userrating desc limit 500 
4

2 回答 2

2

您的第一个呼叫端口应该始终是EXPLAIN查看 MySQL 正在做什么。我怀疑对匹配分数以外的东西进行排序可能无济于事——我认为 mysql 不能在用户评级上使用索引与全文索引同时进行排序。

上次我使用 MySQL 全文搜索(承认是几年前)时,我发现它只是不够快超过一百万行左右。您可能需要考虑全文搜索引擎,例如 cloudsearch、elasticsearch、solr 或 sphinx。

于 2012-05-16T07:46:34.450 回答
1

“标题”有多少种独特的组合?您可能会发现将这些数据放入带有主数据表中外键的查找表中是值得的。

然后在查询数据时,将两个表连接在一起并将过滤器应用于较小的表,这将花费更少的时间来应用。然后连接发生在一个数字字段上,您可以在主数据表中对其进行索引。

这将比在 3.5m 行上执行文本过滤器快得多。假设该数据中有许多重复项,您的查找表可能只是这个大小的一小部分。

您还会发现,如果使用数字而不是文本字段,则读取主数据会更快,因为行会更小,因此整个数据的大小也会更小。

将所有基于文本的数据放入查找中将使一切变得更快,因为主数据表可以变成固定格式而不是动态的,这意味着在表中定位数据时索引更有效。

希望有帮助!

戴夫

于 2012-05-16T07:33:38.310 回答