Mysql 查询需要很长时间
我的SQL代码是否正确?查询可以工作,但它需要非常长的时间,161秒(设置了限制2)。有没有办法优化它Mysql 查询需要很长时间,mysql,sql,Mysql,Sql,我的SQL代码是否正确?查询可以工作,但它需要非常长的时间,161秒(设置了限制2)。有没有办法优化它 SELECT p.itemid as `id`, p.title as `name`, pb.data_txt as `birthdate`, pc.data_txt as `growth`, pd.data_txt as `eyes`, pe.data_txt as `desc`, pf.data_txt as `weight`, p
SELECT p.itemid as `id`,
p.title as `name`,
pb.data_txt as `birthdate`,
pc.data_txt as `growth`,
pd.data_txt as `eyes`,
pe.data_txt as `desc`,
pf.data_txt as `weight`,
pg.data_txt as `sex`,
ph.data_txt as `hair`,
pi.data_txt as `dimensions`,
pj.data_txt as `lang`,
pk.data_txt as `school`,
pl.data_txt as `know`,
p.image as `image`
FROM `jos_sobi2_item` p
INNER JOIN `jos_sobi2_fields_data` AS pb ON pb.itemid = p.itemid
INNER JOIN `jos_sobi2_fields_data` AS pc ON pc.itemid = p.itemid
INNER JOIN `jos_sobi2_fields_data` AS pd ON pd.itemid = p.itemid
INNER JOIN `jos_sobi2_fields_data` AS pe ON pe.itemid = p.itemid
INNER JOIN `jos_sobi2_fields_data` AS pf ON pf.itemid = p.itemid
INNER JOIN `jos_sobi2_fields_data` AS pg ON pg.itemid = p.itemid
INNER JOIN `jos_sobi2_fields_data` AS ph ON ph.itemid = p.itemid
INNER JOIN `jos_sobi2_fields_data` AS pi ON pi.itemid = p.itemid
INNER JOIN `jos_sobi2_fields_data` AS pj ON pj.itemid = p.itemid
INNER JOIN `jos_sobi2_fields_data` AS pk ON pk.itemid = p.itemid
INNER JOIN `jos_sobi2_fields_data` AS pl ON pl.itemid = p.itemid
WHERE
pb.fieldid = 16 AND
pc.fieldid = 17 AND
pd.fieldid = 21 AND
pe.fieldid = 13 AND
pf.fieldid = 18 AND
pg.fieldid = 19 AND
ph.fieldid = 20 AND
pi.fieldid = 22 AND
pj.fieldid = 25 AND
pk.fieldid = 23 AND
pl.fieldid = 24
LIMIT 2
我认为部分内部联接不好。尝试使用条件聚合:
SELECT p.itemid as `id`, p.title as `name`,
max(case when fd.fieldid = 16 then data_txt end) as birthdate,
max(case when fd.fieldid = 17 then data_txt end) as growth,
. . .
FROM `jos_sobi2_item` p INNER JOIN
`jos_sobi2_fields_data` fd
ON fd.itemid = p.itemid
GROUP BY p.itemId, p.title;
您可以添加任意数量的字段,添加更多的字段对性能几乎没有影响
如果您真的希望更快,可以在第一个表中执行限制
:
SELECT p.itemid as `id`, p.title as `name`,
max(case when fd.fieldid = 16 then data_txt end) as birthdate,
max(case when fd.fieldid = 17 then data_txt end) as growth,
. . .
FROM (select p.*
from `jos_sobi2_item` p
limit 2
) p INNER JOIN
`jos_sobi2_fields_data` fd
ON fd.itemid = p.itemid
GROUP BY p.itemId, p.title;
索引和使用说明您真的需要多次加入jos\u sobi2\u字段\u数据吗?!?为什么???如果缺少这些属性中的任何一个,这个查询将不会返回该id的任何行。并且没有ORDER BY的LIMIT是毫无意义的。但除此之外,这可能是最快的查询,如果不是最优雅的话。索引如上所述。@jarlh这是一个EAV。这就是它的工作原理。做一个
解释选择…
并查看结果。其中一个表可能没有itemid索引。如果你在结果中看不到明显的东西,就把它们贴在这里。