【问题标题】:EAV, multiple left join query optimisationEAV、多左连接查询优化
【发布时间】:2020-03-20 07:38:52
【问题描述】:

我们将非常欢迎任何帮助。请原谅我的无知,但我想知道是否有其他人不得不遇到糟糕的 EAV 性能问题。我有一个需要很长时间的特定查询。提高速度的最佳方法是什么?

 SELECT * FROM
(
    SELECT f.*, p.`timestamp`
    FROM `tObjectValues` ov
    INNER JOIN `tObjectProperties` op ON ov.`propertyId` = op.`id`
    INNER JOIN `tObjects` o ON op.`objectId` = o.`id`
    INNER JOIN `files` f ON SUBSTRING(ov.`value`, CHAR_LENGTH('cache://content//')) = f.`filename`
    LEFT JOIN `publishFiles` pf ON f.`id` = pf.`fileId`
    LEFT JOIN `publishes` p ON p.`id` = pf.`publishId` AND o.`appId` = p.`appId` AND p.`type` = 'l'
    WHERE o.`status` = 1 AND op.`status` = 1 AND ov.`status` = 1 AND ov.`value` LIKE 'cache://content/%' AND o.`appId` = 2
    ORDER BY p.`timestamp` DESC
    LIMIT 0, 10000000
) s
GROUP BY s.`id`

我已经运行了解释功能来进一步研究这个问题,但是我想知道是否有人遇到过类似问题可以帮助优化。

【问题讨论】:

  • 函数不能使用索引,所以这可能是一个起点
  • 另外,你的超级查询是无意义的
  • 我不得不承认,我很难在这一切中看到 EAV
  • 感谢您的回答 :) Stawberry,其中的 EAV 部分是 tObjects、tObjectProperties、tObjectValues。该结构是围绕这个概念构建的,因此用户可以以这种方式添加新对象。你说函数不能使用索引,这是什么意思?
  • SUBSTRING(ov.value, CHAR_LENGTH... 正在扼杀性能

标签: mysql database mariadb entity-attribute-value


【解决方案1】:

我想知道是否有其他人不得不遇到糟糕的 EAV 性能问题。

查看标记为 entity-attribute-value 的 780 个其他问题;大多数人都在抱怨性能。

本文讨论 EAV 的弊端,并提供一些帮助:http://mysql.rjweb.org/doc.php/eav

这指出了 WP 使用的草率模式,并建议了如何改进它。也许它的提示适用于您的架构:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta

最后你真的需要额外的GROUP BY吗?

您需要整张桌子吗?它似乎有数百万行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-04
    • 2011-12-05
    • 2019-03-08
    • 2011-04-29
    • 1970-01-01
    • 2019-09-03
    • 2020-02-14
    • 2016-02-16
    相关资源
    最近更新 更多