【问题标题】:Slow SELECT optimization with JOINs使用 JOIN 进行慢速 SELECT 优化
【发布时间】:2019-11-18 10:12:47
【问题描述】:

我的数据库包含以下表格:文章、价格、供应商、制造商和其他。

CREATE TABLE `articles` (
  `id` int(3) NOT NULL,
  `name` varchar(255) COLLATE utf8_bin NOT NULL,
  `manufacturer_id` int(3) NOT NULL,
  `brand_id` int(3) NOT NULL,
  `category_id` int(3) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

CREATE TABLE `prices` (
  `id` int(3) NOT NULL,
  `article_id` int(3) NOT NULL,
  `price` varchar(50) COLLATE utf8_bin NOT NULL,
  `supplier_id` int(3) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

CREATE TABLE `suppliers` (
  `id` int(11) NOT NULL,
  `name` varchar(200) COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

CREATE TABLE `manufacturers` (
  `id` int(5) NOT NULL,
  `name` varchar(255) COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

通过此查询,我输出所有文章并将它们连接到其他表。为了根据供应商过滤商品和价格,我将“价格”表加入到这个查询中。

SELECT DISTINCT articles.id 
              , manufacturers.name manufacturer_name
              ,
           FROM articles
           LEFT 
           JOIN manufacturers
             ON articles.manufacturer_id = manufacturers.id
           LEFT 
           JOIN prices
             ON articles.id = prices.article_id

此查询的运行速度非常慢(大约 6 秒)。

当我将 LEFT JOIN 替换为 INNER JOIN 时,输出速度非常快,但不会输出没有价格的项目。

INNER JOIN prices
    ON articles.id = prices.article_id

如何优化查询:正确加入并快速输出价格的文章?

【问题讨论】:

  • 你的表有索引吗?
  • 这不是您的查询。但是,如果是这样,那么 LEFT JOIN 一个您不选择任何列的表将毫无意义。另外,请注意INT 后面括号中的数字几乎完全没有意义
  • @Strawberry 谢谢!对没有选择列的表使用 LEFT JOIN 的声明将毫无意义,这让我想到了解决方案:)

标签: mysql performance optimization


【解决方案1】:

您需要做的第一件事是添加索引以提高 MySql 性能。

Mysql performance indexes explain

【讨论】:

    猜你喜欢
    • 2021-08-01
    • 1970-01-01
    • 2013-01-14
    • 2011-08-19
    • 1970-01-01
    • 2016-01-05
    • 2013-04-16
    • 1970-01-01
    • 2019-08-30
    相关资源
    最近更新 更多