作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包含四个表(项目、属性、快照和值)的 MySQL 数据库。基本上,值 表包含给定特定日期(快照)的项目 的特定属性 的值。
表值包含以下列
现在我想为所有其他属性具有特定值的项目获取某个属性 (-id) 的值:
SELECT * FROM
(SELECT * FROM remian.remian_propertyvalue WHERE
FK_ItemId IN (SELECT FK_ItemId FROM (SELECT * FROM remian.remian_propertyvalue WHERE FK_PropertyId=1) AS trackerentries WHERE trackerentries.Value IN (12,11) AND
FK_ItemId IN (SELECT FK_ItemId FROM (SELECT * FROM remian.remian_propertyvalue WHERE FK_PropertyId=12) AS statustable WHERE statustable.Value NOT IN ("Rejected","Closed")) AND
FK_ItemId IN (SELECT FK_ItemId FROM (SELECT * FROM remian.remian_propertyvalue WHERE FK_PropertyId=2) AS projectentries WHERE projectentries.Value IN (73,74)))) AS queried
WHERE queried.FK_PropertyId=12 AND FK_SnapshotId = 1;
此查询确实有效,但速度非常慢(5000 个条目需要 80 秒)。有没有更有效的方法来做到这一点?
最佳答案
EAV 模式使用起来非常困惑。使用 IN ( SELECT ... )
只会让它变得更糟和更慢。
你需要尝试不使用子查询,只使用JOINs
,比如
SELECT *
FROM remian_propertyvalue AS a
JOIN remian_propertyvalue AS b USING(FK_ItemId)
JOIN remian_propertyvalue AS c USING(FK_ItemId)
WHERE a.FK_PropertyId = 1 AND a.value IN (12,11)
AND b.FK_PropertyId = 12 AND b.value IN ("Rejected","Closed")
AND c.FK_PropertyId = 2 AND c.value IN (73,74)
AND a.FK_PropertyId = 12 AND a.FK_SnapshotId = 1;
此外,“property”表上没有AUTO_INCREMENT
。取而代之的是
PRIMARY KEY(itemId, propertyId),
INDEX(propertyId, value)
这些索引可能存在问题;我真的需要查看 SHOW CREATE TABLE
来提供帮助。
更多:
关于MySQL - 带有 IN 子句的查询表现不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49450001/
我是一名优秀的程序员,十分优秀!