我有一张产品表,约有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
答案 0 :(得分:2)
您的第一个呼叫端口应始终为EXPLAIN
,以查看MySQL正在执行的操作。我怀疑对匹配得分以外的其他东西进行排序可能没有帮助 - 我不认为mysql能够在全文索引的同时使用用于排序的索引。
上次我使用MySQL全文搜索(几年前不可否认)我发现它的速度不够快,超过一百万行左右。您可能需要考虑全文搜索引擎,例如cloudsearch,elasticsearch,solr或sphinx。
答案 1 :(得分:1)
有多少个“标题”的独特组合?您可能会发现将数据放入主数据表中带有外键的查找表中是值得的。
然后在查询数据时,将两个表连接在一起并将过滤器应用于较小的表,这将花费较少的时间来应用。然后,连接发生在数字字段上,您可以在主数据表中进行索引。
这比在3.5米行上执行文本过滤要快得多。假设该数据中有许多重复,您的查找表可能只是这个数量的一小部分。
如果存在数字而不是文本字段,您还会发现读取主数据的速度会更快,因为行数会更小,因此整个数据量会更小。
将所有基于文本的数据放入查找中会使一切变得更快,因为主数据表可以变为固定格式而不是动态格式,这意味着在表中查找数据时索引更有效。
希望有所帮助!
戴夫