MySQL查询优化和性能

问题描述 投票:0回答:1

我有以下表结构:

CREATE TABLE IF NOT EXISTS `products` (
`id_product` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(60) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id_product`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;

CREATE TABLE IF NOT EXISTS `products_vars` (
`id_product` int(10) unsigned NOT NULL,
`id_product_var` int(10) unsigned NOT NULL AUTO_INCREMENT,
`price` decimal(7,2) NOT NULL,
`discount` tinyint(3) unsigned NOT NULL DEFAULT '0',
`stock` smallint(6) NOT NULL DEFAULT '0',
`coming_soon` enum('y','n') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'n',
`date_add` datetime DEFAULT NULL,
`date_update` datetime DEFAULT NULL,
`active` enum('y','n') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'n',
PRIMARY KEY (`id_product_var`),
KEY `id_product` (`id_product`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

ALTER TABLE `products_vars`
ADD CONSTRAINT `products_vars_ibfk_1` FOREIGN KEY (`id_product`) REFERENCES `products` (`id_product`) ON DELETE CASCADE ON UPDATE CASCADE;

我需要使用正确的ID获得最便宜的产品,下面的查询效果很好,但我认为它有点慢,所以我想知道是否有其他方法可以做到这一点。

SELECT p.id_product, pv.coming_soon, pv.date_add, pv.price * (1 - (pv.discount / 100)) AS price, MAX(pv.stock) AS stock, MAX(pv.date_add) AS date_add
FROM products AS p
INNER JOIN products_vars AS pv USING(id_product)
INNER JOIN (SELECT pv.id_product, MIN(pv.price * (1 - (pv.discount / 100))) AS min_price
    FROM products_vars AS pv
    WHERE pv.active = 'y'
    GROUP BY pv.id_product) AS pv2
    ON pv2.id_product = pv.id_product
        AND min_price = pv.price * (1 - (pv.discount / 100))
WHERE pv.active = 'y'
GROUP BY pv.id_product

还有最后一件事:表“products_vars”可以包含产品的几种变体(颜色或大小),如果至少其中一个有"coming_soon" = "n",最好的方法是什么?

mysql query-optimization inner-join query-performance
1个回答
0
投票

好吧,这是我现在可以使用的查询:

SELECT 
    p.id_product,
    pv.coming_soon,
    pv.date_add,
    pv.price * (1 - (pv.discount / 100)) AS price,
    MAX(pv.stock) AS stock,
    MAX(pv.date_add) AS date_add,
    (SELECT pv2.coming_soon FROM products_vars AS pv2 WHERE pv2.id_product = p.id_product AND pv2.coming_soon = 'n' LIMIT 1) AS coming_soon
FROM products AS p
INNER JOIN products_vars AS pv USING(id_product)
INNER JOIN (SELECT pv.id_product, MIN(pv.price * (1 - (pv.discount / 100))) AS min_price
    FROM products_vars AS pv
    WHERE pv.active = 'y'
    GROUP BY pv.id_product) AS pv2
    ON pv2.id_product = pv.id_product
        AND min_price = pv.price * (1 - (pv.discount / 100))
WHERE pv.active = 'y'
GROUP BY pv.id_product
ORDER BY stock DESC

它运作良好,但我想知道是否: 1-它已经过优化 2-如何按名称对产品进行排序,但仅限于可用的产品(库存> 0),那么不可用的产品最终会出现?

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.