【问题标题】:Query Optimisation on table with 3,500,000 rows, indexing对具有 3,500,000 行、索引的表进行查询优化
【发布时间】:2023-03-19 12:22:01
【问题描述】:

我有一个大约 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 

【问题讨论】:

    标签: mysql sql query-optimization


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      希望有帮助!

      戴夫

      【讨论】:

        猜你喜欢
        • 2016-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-05
        • 2016-10-27
        • 1970-01-01
        相关资源
        最近更新 更多