mysql - 优化mysql多重左连接

标签 mysql sql query-optimization

我有这样的查询:

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 (SELECT  produs, cantitate, COS FROM comenzi) c ON p.id = c.produs
  LEFT JOIN (SELECT STATUS, id FROM cosuri) cs ON c.cos = cs.id
  LEFT JOIN (SELECT id, seo FROM 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

查询正常,但 1 个查询的持续时间:2.922 秒。 如何改进查询?

按键如下:

comenzi: cos, produs 作为唯一键

cosuri: id 作为唯一键

产品:标题、类别、别名作为键

最佳答案

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

去掉所有子查询后再试试。喜欢:

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 列表在所有表中都是 PK,否则这些列也需要 index

关于mysql - 优化mysql多重左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24202717/

相关文章:

PHP 5.3 magick 引用 gpc

php - 根据时间戳生成唯一的 id laravel 5

php - 架构数据库 : get latest insert ID

mysql - 请帮我优化一个mysql搜索查询

MySQL 查询 - 取消 ORDER BY 使查询速度提高 100 倍

mysql - 截断表数据会自动删除或截断 View 数据吗?

mysql - 如何返回表中与 MySQL 中另一列共享相同值的重复项?

sql - 从另一个表中选择范围之间的记录

sql - Firebird - PGSQL 中的串行字段?

ms-access - 使用 "NOT IN"时子查询非常慢