2012-12-21 30 views
0

當我添加從JOINED表派生的ORDER BY時,執行查詢的時間從0.008秒增加到0.50秒,儘管在order by字段中有一個索引。以下是查詢:Order By on Join需要年齡

SELECT a.productid 
FROM products a 
    JOIN products_lng b FORCE INDEX (primary) 
    ON a.productid = b.productid 
     AND b.code = 'US' 
    JOIN pricing c 
    ON c.productid = a.productid 
    JOIN thumbnails d 
    ON d.productid = a.productid 
    JOIN bigthumbnails e 
    ON e.productid = a.productid 
    JOIN products_categories f 
    ON f.productid = a.productid 
WHERE a.forsale = 'Y' 
GROUP BY b.productid 
ORDER BY b.product 

解釋計劃: enter image description here

B具有以下指標:

enter image description here

CREATE TABLE `products_lng` (
`code` varchar(2) CHARACTER SET latin1 NOT NULL DEFAULT '', 
`productid` int(11) NOT NULL DEFAULT '0', 
`product` varchar(255) CHARACTER SET latin1 NOT NULL DEFAULT '', 
`descr` varchar(512) CHARACTER SET latin1 NOT NULL, 
`full_descr` varchar(1024) CHARACTER SET latin1 NOT NULL, 
`processed` varchar(1) CHARACTER SET latin1 NOT NULL, 
PRIMARY KEY (`code`,`productid`,`product`), 
KEY `ad` (`code`,`productid`,`product`,`descr`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin 
+2

這是因爲MySQL已經使用了主鍵,它不會使用其他索引進行排序。 –

+0

當我在「PRIMARY」索引中添加字段「product」時,它只需要更多時間 – bicycle

+0

實際上,爲什麼使用表「a」?你不需要它。 –

回答

0

最後,這似乎是該組合的ORDER BY和GROUP BY是執行查詢花費時間比平常長的原因。通過將查詢放置在子查詢中,因此將ORDER BY和GROUP BY分開,我設法將執行時間大幅度限制爲0.0015秒,而不是原來的0.5秒。我仍然需要根據我的要求調整查詢,但以下是它的外觀。基本上,歸根結底,在子查詢中,您可以定義WHERE參數和周圍的查詢,您希望選擇哪個值。

SELECT z.*,d.*,e.* 
FROM products_lng z 
JOIN thumbnails d ON d.productid = z.productid 
JOIN bigthumbnails e ON e.productid = z.productid 
WHERE EXISTS 
    (SELECT b.productid 
    FROM products b 
    JOIN pricing c ON c.productid = b.productid 
    JOIN products_lng i USE INDEX (PRIMARY) ON i.productid = b.productid 
    AND i.code = 'US' 
    JOIN products_categories f ON f.productid = b.productid 
    WHERE b.productid = z.productid 
    GROUP BY b.productid) 
ORDER BY z.product