私は2つのテーブルを持っています:
CREATE TABLE IF NOT EXISTS `products` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`categoryId` int(10) unsigned DEFAULT NULL,
`parentId` int(10) unsigned DEFAULT NULL,
`barcode` varchar(255) DEFAULT NULL,
`code` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_products_product_categories1_idx` (`categoryId`),
KEY `fk_products_products1_idx` (`parentId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=71521 ;
CREATE TABLE IF NOT EXISTS `inventory` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`depotId` int(10) unsigned NOT NULL,
`productId` int(10) unsigned NOT NULL,
`remain` int(11) DEFAULT NULL,
`remain2` int(10) unsigned DEFAULT NULL,
`updatedDateTime` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_inventory_depots1_idx` (`depotId`),
KEY `fk_inventory_products1_idx` (`productId`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=89291 ;
次のクエリを最適化するのを手伝ってください (パフォーマンスを向上させるためにどのインデックスを追加する必要があるか)。クエリは 0.2578 秒かかりました (MySQL はインデックス fk_inventory_depots1_idx を使用しています)。AND i.depotId = 3 を削除すると、クエリは 0.5484 秒かかりました。EXPLAIN クエリは、Extra: Using where; を示しています。一時的な使用; ファイルソートの使用
SELECT `p`.* , SUM(i.remain) AS `remain` , SUM(i.remain2) AS `remain2`
FROM `products` AS `p`
LEFT JOIN `inventory` AS `i` ON p.id = i.productId
WHERE remain != 0 AND i.depotId = 3
GROUP BY `p`.`id`
ORDER BY `p`.`id` DESC
LIMIT 50