Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查询需要很长时间_Mysql_Sql - Fatal编程技术网

Mysql 查询需要很长时间

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

我的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`,
    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索引。如果你在结果中看不到明显的东西,就把它们贴在这里。