带内连接的MySQL Query需要很长时间

时间:2014-03-04 19:46:43

标签: mysql join

虽然表中没有太多产品,但以下查询需要太长时间。 如果我在没有内部联接的情况下查询它,那么每件事情可以请某人帮助找到问题或优化此查询。

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方法可能有用,我只是想看看是否有更好的解决方案。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您的问题是内部联接中的OR。它使它成为一个更昂贵的连接。您可以使用EXPLAIN https://dev.mysql.com/doc/refman/5.0/en/using-explain.html查看影响。

答案 1 :(得分:0)

试试这个: -

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)