【发布时间】: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