[英]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.