簡體   English   中英

具有內部聯接的MySQL查詢需要很長時間

[英]MySQL Query with inner join takes long time

盡管表中沒有太多產品,但以下查詢花費的時間太長。 如果我沒有內部聯接就查詢它,一切都很好。 可以請其他人幫助找到問題或優化此查詢。

SELECT P.ID AS ID, 
IFNULL(P.MIN_PRICE, 0) AS PRICE_MIN, 
IFNULL(P.MAX_PRICE, 0) AS PRICE_MAX, 
IFNULL(P.STORE_COUNT, 0) AS STORE_COUNT, 
P.TITLE AS TITLE, 
'' AS DETAIL, 
P.MANUFACTURER
FROM PRODUCT P 
INNER JOIN PRODUCT P1 on (P1.ID=P.PARENT_ID) OR (P.ID=P1.ID) WHERE P.PARENT_ID=0 AND P.ISVALID='Y' AND P1.CATEGORY_ID IN (2040)

這是表結構:

CREATE TABLE IF NOT EXISTS `PRODUCT` (
`ID` int(11) unsigned NOT NULL DEFAULT '0',
`CATEGORY_ID` int(11) unsigned NOT NULL DEFAULT '0',
`TITLE` varchar(255) NOT NULL DEFAULT ' ',
`FILENAME` varchar(255) DEFAULT ' ',
`MANUFACTURER` int(11) unsigned NOT NULL DEFAULT '0',
`EAN_UPC` varchar(100) DEFAULT '',
`MIN_PRICE` decimal(9,2) DEFAULT '0.00',
`MAX_PRICE` decimal(9,2) DEFAULT '0.00',
`STORE_COUNT` int(11) unsigned DEFAULT '0',
`ISVALID` enum('Y','N') NOT NULL DEFAULT 'Y',
`FEATURES_SELECTED` enum('Y','N') NOT NULL DEFAULT 'N',
`PARENT_ID` int(11) DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `IndexCATEGORY_ID` (`CATEGORY_ID`),
KEY `IndexFILENAME` (`FILENAME`),
KEY `IndexMANUFACTURER` (`MANUFACTURER`),
KEY `IndexISVALID` (`ISVALID`),
KEY `IndexCOMP1` (`ID`,`ISVALID`),
KEY `IndexORDER_BY` (`CATEGORY_ID`,`ISVALID`,`STORE_COUNT`),
KEY `IndexTOTAL` (`CATEGORY_ID`,`ISVALID`),
KEY `IndexPARENT_ID` (`PARENT_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

編輯:我嘗試獲取類別或其子類別中的所有產品。 有些產品有父母:假設有10種不同尺寸的牛仔褲。 其他人沒有父母,但他們也不是孩子(孤兒):可以說一條沒有任何變化的圍巾。 現在,如果我刪除OR,我只會得到牛仔褲,因為滿足了加入的第一個條件。 但是它不會退還圍巾,盡管它是該類別中的有效產品。

編輯:@BhupeshC這里一些數據(CATEGORY_ID = 2040):

ID   PARENT_ID TITLE 
1    0         Dress blue
2    1         Dress blue XS
3    1         Dress blue S
4    1         Dress blue M
5    0         Dress Yellow
6    5         Dress Yellow M
7    5         Dress Yellow L
8    5         Dress Yellow XL
9    0         Scarf men
10   0         Scarf women

其余列可以設置為默認值。 預期結果:

ID   PARENT_ID TITLE 
1    0         Dress blue
5    0         Dress Yellow
9    0         Scarf men
10   0         Scarf women

編輯:當我查看數據時,我認為有人會說只查詢parent_id = 0的產品。 請不要那樣做。 因為我只是簡化了查詢。 在原始查詢中,可以根據只能在子產品上找到的信息來過濾數據,但這會使問題變得更加復雜。 例如。 我只想顯示XL尺寸的產品。 但是DrewB的UNION方法可能有用,我只是想看看是否有更好的解決方案。

感謝幫助。

您的問題是內部聯接中的OR。 這使它成為昂貴得多的聯接。 您可以使用EXPLAIN https://dev.mysql.com/doc/refman/5.0/en/using-explain.html來查看影響。

嘗試這個 : -

SELECT P.ID AS ID, 
IFNULL(P.MIN_PRICE, 0) AS PRICE_MIN, 
IFNULL(P.MAX_PRICE, 0) AS PRICE_MAX, 
IFNULL(P.STORE_COUNT, 0) AS STORE_COUNT, 
P.TITLE AS TITLE, 
'' AS DETAIL, 
P.MANUFACTURER
FROM PRODUCT P 
LEFT JOIN PRODUCT P1 on (P1.ID=P.PARENT_ID) WHERE P.PARENT_ID=0 AND P.ISVALID='Y' AND P1.CATEGORY_ID IN (2040)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM