【发布时间】: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