Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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_Query Optimization - Fatal编程技术网

优化mysql多个左连接

优化mysql多个左连接,mysql,sql,query-optimization,Mysql,Sql,Query Optimization,我有这样一个问题: 选择 苏姆克·坎蒂塔特作为一个数字, p、 id为pid, p、 titlu作为titlu, p、 别名作为别名, p、 gramaj作为gramaj, p、 prettotal作为prettotal, p、 前训研所作为前训研所, p、 比雷德杜斯比雷德杜斯比雷德杜斯比雷德杜斯比雷德杜斯比雷德杜斯比雷德杜斯比雷德杜斯比雷德杜斯, p、 stoc作为stoc, p、 不能像不能一样, p、 nou AS nou, p、 像凝结一样凝结, p、 鳕鱼作为鳕鱼, p、 波扎作为波

我有这样一个问题:

选择 苏姆克·坎蒂塔特作为一个数字, p、 id为pid, p、 titlu作为titlu, p、 别名作为别名, p、 gramaj作为gramaj, p、 prettotal作为prettotal, p、 前训研所作为前训研所, p、 比雷德杜斯比雷德杜斯比雷德杜斯比雷德杜斯比雷德杜斯比雷德杜斯比雷德杜斯比雷德杜斯比雷德杜斯, p、 stoc作为stoc, p、 不能像不能一样, p、 nou AS nou, p、 像凝结一样凝结, p、 鳕鱼作为鳕鱼, p、 波扎作为波扎, 抄送搜索引擎优化作为搜索引擎优化 来自produse p 左连接选择p.id=c.produs上的comenzi c的produs、cantitate、COS 左连接选择状态,c.cos=cs.id上cosurics的id 左连接选择id,seo从categorii在p.categorie=cc.id上抄送 其中cs.status='closed'和p.vizibil='1' 按pid分组 按数字说明订购 限制0,14 查询正在运行,但1个查询的持续时间:2.922秒。 如何改进查询

关键点如下:

科门齐:因为,普罗德斯是唯一的钥匙

cosuri:id作为唯一密钥


产品名称:titlu、categorie、别名as key

您可以这样做:这将花费更少的时间

SELECT
  SUM(c.cantitate) AS num,
  p.id             AS pid,
  p.titlu          AS titlu,
  p.alias          AS alias,
  p.gramaj         AS gramaj,
  p.prettotal      AS prettotal,
  p.pretunitar     AS pretunitar,
  p.pretredus      AS pretredus,
  p.stoc           AS stoc,
  p.cant_variabila AS cant_variabila,
  p.nou            AS nou,
  p.congelat       AS congelat,
  p.cod            AS cod,
  p.poza           AS poza,
  cc.seo           AS seo
FROM produse p
  LEFT JOIN comenzi c ON p.id = c.produs
  LEFT JOIN cosuri cs ON c.cos = cs.id
  LEFT JOIN categorii cc ON p.categorie = cc.id
WHERE cs.status = 'closed' AND p.vizibil = '1'
GROUP BY pid
ORDER BY num DESC
LIMIT 0, 14

你可以这样做:这将花费更少的时间

SELECT
  SUM(c.cantitate) AS num,
  p.id             AS pid,
  p.titlu          AS titlu,
  p.alias          AS alias,
  p.gramaj         AS gramaj,
  p.prettotal      AS prettotal,
  p.pretunitar     AS pretunitar,
  p.pretredus      AS pretredus,
  p.stoc           AS stoc,
  p.cant_variabila AS cant_variabila,
  p.nou            AS nou,
  p.congelat       AS congelat,
  p.cod            AS cod,
  p.poza           AS poza,
  cc.seo           AS seo
FROM produse p
  LEFT JOIN comenzi c ON p.id = c.produs
  LEFT JOIN cosuri cs ON c.cos = cs.id
  LEFT JOIN categorii cc ON p.categorie = cc.id
WHERE cs.status = 'closed' AND p.vizibil = '1'
GROUP BY pid
ORDER BY num DESC
LIMIT 0, 14
由于您有很多子查询,因此时间将花费在读取完整数据上。如果直接在表上而不是子查询上应用联接,将提高性能

请在删除所有子查询后重试。比如:

SELECT
  SUM(c.cantitate) AS num,
  p.id             AS pid,
  p.titlu          AS titlu,
  p.alias          AS alias,
  p.gramaj         AS gramaj,
  p.prettotal      AS prettotal,
  p.pretunitar     AS pretunitar,
  p.pretredus      AS pretredus,
  p.stoc           AS stoc,
  p.cant_variabila AS cant_variabila,
  p.nou            AS nou,
  p.congelat       AS congelat,
  p.cod            AS cod,
  p.poza           AS poza,
  cc.seo           AS seo
FROM produse p
  LEFT JOIN comenzi c
    ON p.id = c.produs
  LEFT JOIN cosuri cs
    ON c.cos = cs.id
  LEFT JOIN categorii cc
    ON p.categorie = cc.id
WHERE cs.status = 'closed'
    AND p.vizibil = '1'
GROUP BY pid
ORDER BY num DESC
LIMIT 0, 14
您还应该具有以下索引:

+---------+------------+
|  TABLE  |   COLUMN   |
+---------+------------+
| produse | categorie  |
| produse | vizibil    |
| comenzi | produs     |
| comenzi | cos        |
| cosuri  | status     |
+---------+------------+
假设id column table在所有表中都是PK,否则这些列也需要索引。

因为您有很多子查询,所以时间将花在读取完整数据上。如果直接在表上而不是子查询上应用联接,将提高性能

请在删除所有子查询后重试。比如:

SELECT
  SUM(c.cantitate) AS num,
  p.id             AS pid,
  p.titlu          AS titlu,
  p.alias          AS alias,
  p.gramaj         AS gramaj,
  p.prettotal      AS prettotal,
  p.pretunitar     AS pretunitar,
  p.pretredus      AS pretredus,
  p.stoc           AS stoc,
  p.cant_variabila AS cant_variabila,
  p.nou            AS nou,
  p.congelat       AS congelat,
  p.cod            AS cod,
  p.poza           AS poza,
  cc.seo           AS seo
FROM produse p
  LEFT JOIN comenzi c
    ON p.id = c.produs
  LEFT JOIN cosuri cs
    ON c.cos = cs.id
  LEFT JOIN categorii cc
    ON p.categorie = cc.id
WHERE cs.status = 'closed'
    AND p.vizibil = '1'
GROUP BY pid
ORDER BY num DESC
LIMIT 0, 14
您还应该具有以下索引:

+---------+------------+
|  TABLE  |   COLUMN   |
+---------+------------+
| produse | categorie  |
| produse | vizibil    |
| comenzi | produs     |
| comenzi | cos        |
| cosuri  | status     |
+---------+------------+
假设id列table在所有表中都是PK,否则这些列也需要索引。

这会很快

SELECT
  SUM(c.cantitate) AS num,
  p.id             AS pid,
  p.titlu          AS titlu,
  p.alias          AS alias,
  p.gramaj         AS gramaj,
  p.prettotal      AS prettotal,
  p.pretunitar     AS pretunitar,
  p.pretredus      AS pretredus,
  p.stoc           AS stoc,
  p.cant_variabila AS cant_variabila,
  p.nou            AS nou,
  p.congelat       AS congelat,
  p.cod            AS cod,
  p.poza           AS poza,
  cc.seo           AS seo
FROM produse p
  LEFT JOIN comenzi c ON p.id = c.produs
  LEFT JOIN cosuri cs ON c.cos = cs.id
  LEFT JOIN categorii cc ON p.categorie = cc.id
WHERE cs.status = 'closed' AND p.vizibil = '1'
GROUP BY pid
ORDER BY num DESC
LIMIT 0, 14
会很快的

SELECT
  SUM(c.cantitate) AS num,
  p.id             AS pid,
  p.titlu          AS titlu,
  p.alias          AS alias,
  p.gramaj         AS gramaj,
  p.prettotal      AS prettotal,
  p.pretunitar     AS pretunitar,
  p.pretredus      AS pretredus,
  p.stoc           AS stoc,
  p.cant_variabila AS cant_variabila,
  p.nou            AS nou,
  p.congelat       AS congelat,
  p.cod            AS cod,
  p.poza           AS poza,
  cc.seo           AS seo
FROM produse p
  LEFT JOIN comenzi c ON p.id = c.produs
  LEFT JOIN cosuri cs ON c.cos = cs.id
  LEFT JOIN categorii cc ON p.categorie = cc.id
WHERE cs.status = 'closed' AND p.vizibil = '1'
GROUP BY pid
ORDER BY num DESC
LIMIT 0, 14

只需删除子查询。这对你没有帮助。测试一下,告诉我们需要多少

SELECT
  SUM(c.cantitate) AS num,
  p.id             AS pid,
  p.titlu          AS titlu,
  p.alias          AS alias,
  p.gramaj         AS gramaj,
  p.prettotal      AS prettotal,
  p.pretunitar     AS pretunitar,
  p.pretredus      AS pretredus,
  p.stoc           AS stoc,
  p.cant_variabila AS cant_variabila,
  p.nou            AS nou,
  p.congelat       AS congelat,
  p.cod            AS cod,
  p.poza           AS poza,
  cc.seo           AS seo
FROM produse p
  LEFT JOIN comenzi   c  ON p.id = c.produs
  LEFT JOIN cosuri    cs ON c.cos = cs.id
  LEFT JOIN categorii cc ON p.categorie = cc.id
WHERE cs.status = 'closed' AND p.vizibil = '1'
GROUP BY pid
ORDER BY num DESC
LIMIT 0, 14
当然,如果有以下字段的索引,则会有所帮助:

p、 id主键已编制索引,无需创建新的索引 cc.id主键已编制索引,无需创建新的主键 cs.id主键已编制索引,无需创建新的索引 p、 分类 p、 vizibil在这里的潜在收益较小 c、 普罗德斯 c、 因为 cs.这里的潜在收益较小 p、 pid忘记group by需要订购记录的典型错误
只需删除子查询。这对你没有帮助。测试一下,告诉我们需要多少

SELECT
  SUM(c.cantitate) AS num,
  p.id             AS pid,
  p.titlu          AS titlu,
  p.alias          AS alias,
  p.gramaj         AS gramaj,
  p.prettotal      AS prettotal,
  p.pretunitar     AS pretunitar,
  p.pretredus      AS pretredus,
  p.stoc           AS stoc,
  p.cant_variabila AS cant_variabila,
  p.nou            AS nou,
  p.congelat       AS congelat,
  p.cod            AS cod,
  p.poza           AS poza,
  cc.seo           AS seo
FROM produse p
  LEFT JOIN comenzi   c  ON p.id = c.produs
  LEFT JOIN cosuri    cs ON c.cos = cs.id
  LEFT JOIN categorii cc ON p.categorie = cc.id
WHERE cs.status = 'closed' AND p.vizibil = '1'
GROUP BY pid
ORDER BY num DESC
LIMIT 0, 14
当然,如果有以下字段的索引,则会有所帮助:

p、 id主键已编制索引,无需创建新的索引 cc.id主键已编制索引,无需创建新的主键 cs.id主键已编制索引,无需创建新的索引 p、 分类 p、 vizibil在这里的潜在收益较小 c、 普罗德斯 c、 因为 cs.这里的潜在收益较小 p、 pid忘记group by需要订购记录的典型错误
很抱歉,我们需要更多的细节,比如解释输出和涉及的模式/索引。现在的问题是——使用汽车类比——类似于我的汽车图片,为什么它不会启动?。丢失子查询并连接到表中,避免MySQL将整个表复制到临时表中。MySQL足够聪明,只使用它所需的表的一部分,不需要使用子查询来尝试减少行数,让数据库引擎来处理。对于1个查询的子查询持续时间:3.047秒和1个查询的持续时间:3.969秒,没有子查询我很抱歉,但我们需要更多详细信息,例如解释输出和涉及的模式/索引。现在的问题是——使用汽车类比——类似于我的汽车图片,为什么它不会启动?。丢失子查询并连接到表中,避免MySQL将整个表复制到临时表中。MySQL足够聪明,只使用它需要的表的一部分,不需要使用子查询来尝试减少行数,让数据库引擎来处理这个问题。1个查询的子查询持续时间:3.047秒,1个查询的持续时间:3.969秒subquery@speedy:进行解释以确保实际使用了您拥有的密钥。使用Ambrish索引时,1次查询的持续时间:LocalHost上的持续时间为2.813秒。在cosuri.status上确实有索引。如果没有,请再次创建并测试查询。@speedy:进行解释以确保实际使用了您拥有的键。使用Ambrish索引,1个查询的持续时间:LocalHost上的持续时间为2.813秒。在cosuri.status上确实有索引。如果没有,则再次创建并测试查询。