我有一個查詢來選擇訂單,並且我需要獲取每個訂單的產品清單,其中包含每個產品的彙總數量。慢速查詢SELECT ...兩個表字段上的SELECT ... GROUP BY(MySQL/InnoDB)
目前,它的速度很慢(10秒我的設置),我需要加快速度。
更新:切換到的MyISAM是不是一種選擇,我需要交易
查詢目前是這樣的:
SELECT `Order`.*, `Product`.`id`, `Product`.`msrp`, SUM(`OrderItem`.`quantity`) AS sum
FROM `orders` AS `Order`
LEFT JOIN `order_items` AS `OrderItem` ON (`OrderItem`.`order_id` = `Order`.`id`)
LEFT JOIN `product_variations` AS `ProductVariation` ON (`OrderItem`.`product_variation_id` = `ProductVariation`.`id`)
LEFT JOIN `products` AS `Product` ON (`ProductVariation`.`product_id` = `Product`.`id`)
WHERE 1 = 1
GROUP BY `Order`.`id`, `Product`.`id`
ORDER BY `Order`.`created` DESC
LIMIT 20;
解釋:
模式(截斷,僅剩下必填字段):
CREATE TABLE `orders` (
`id` int(11) NOT NULL auto_increment,
`created` timestamp NOT NULL default CURRENT_TIMESTAMP,
`customer_comments` text NOT NULL,
PRIMARY KEY (`id`),
KEY `created` (`created`),
KEY `id_created` (`id`,`created`),
) ENGINE=InnoDB
CREATE TABLE `order_items` (
`id` int(11) NOT NULL auto_increment,
`order_id` int(11) NOT NULL,
`product_variation_id` int(11) NOT NULL,
`type` enum('First','Second') default NULL,
`quantity` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `item_UNIQUE` (`order_id`,`product_variation_id`,`type`),
KEY `fk_order_items_product_variations1` (`product_variation_id`),
CONSTRAINT `fk_order_items_orders1` FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_order_items_product_variations1` FOREIGN KEY (`product_variation_id`) REFERENCES `product_variations` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB
CREATE TABLE `product_variations` (
`id` int(11) NOT NULL auto_increment,
`product_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_product_variations_products1` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
) ENGINE=InnoDB
CREATE TABLE `products` (
`id` int(11) NOT NULL auto_increment,
`msrp` decimal(5,2) NOT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB
服務器是MySQL 5.0.77,表是InnoDB。 orders
大約是75K的記錄,order_items
160K記錄,product_variations
140K記錄,product
- 300條記錄。
任何幫助表示讚賞。
作爲最後手段,我舉行了預計算和和其他聚合。我的理解是,如果RDBMS擅長某些事情 - 那就是過濾,分組和集合。我當然可以預先計算所有聚合,爲什麼要使用RDBMS呢? – lxa
關於上下文 - 它是網頁界面分頁查詢; (實際上是其中的一部分 - 我需要爲每個「訂單」再總結一次 - 不確定如何執行此操作,因爲WITH ROLLUP不適用於此查詢)。 – lxa
這裏的問題不在於RDBMS,而在於表引擎。切換到MyISAM只是爲了測試聚合是否確實是瓶頸。 InnoDB在聚合時讀取每一行,而MyISAM則不會。所以不幸的是,如果你想要InnoDB的事務/約束特性,你必須自己緩存聚合。 – Matt